为小程序和后台管理系统配置不同的Token解析对象,实现独立的认证体系。
jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/AppletJwtToken.java
public class AppletJwtToken implements AuthenticationToken {
private String token;
public AppletJwtToken(String token) {
this.token = token;
}
@Override
public Object getPrincipal() {
return token;
}
@Override
public Object getCredentials() {
return token;
}
}
jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/AppletShiroRealm.java
@Component
@Slf4j
public class AppletShiroRealm extends AuthorizingRealm {
@Override
public boolean supports(AuthenticationToken token) {
return token instanceof AppletJwtToken;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken auth) throws AuthenticationException {
// 小程序专用的身份认证逻辑
String token = (String) auth.getCredentials();
LoginUser loginUser = this.checkAppletUserTokenIsEffect(token);
return new SimpleAuthenticationInfo(loginUser, token, getName());
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 小程序专用的权限认证逻辑
// 可以配置不同的角色和权限体系
return info;
}
}
jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/AppletJwtFilter.java
@Slf4j
public class AppletJwtFilter extends BasicHttpAuthenticationFilter {
@Resource
private AppletShiroRealm appletRealm;
@Override
protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception {
// 使用小程序专用的Token和Realm
AppletJwtToken jwtToken = new AppletJwtToken(token);
getSubject(request, response).login(jwtToken);
return true;
}
}
jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java
@Bean("appletSecurityManager")
public DefaultWebSecurityManager appletSecurityManager(AppletShiroRealm appletRealm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setRealm(appletRealm);
// 配置小程序专用的SecurityManager
return securityManager;
}
JwtToken
ShiroRealm
securityManager
AppletJwtToken
AppletShiroRealm
appletSecurityManager
@GetMapping("/user/info")
@Operation(summary = "获取小程序用户信息")
public Result<UserInfo> getAppletUserInfo() {
// 使用AppletJwtToken进行认证
// 通过AppletShiroRealm进行权限验证
return Result.OK(userInfo);
}
@GetMapping("/sys/user/list")
@Operation(summary = "获取后台用户列表")
public Result<IPage<SysUser>> getBackendUserList() {
// 使用JwtToken进行认证
// 通过ShiroRealm进行权限验证
return Result.OK(userList);
}
@GetMapping("/health")
@IgnoreAuth
@Operation(summary = "健康检查")
public Result<String> health() {
// 使用@IgnoreAuth注解,跳过认证
return Result.OK("健康管理小程序模块运行正常");
}
// applet专用过滤器,只处理/applet开头的请求
filterChainDefinitionMap.put("/applet/**", "applet");
// 其他请求使用jwt过滤器
filterChainDefinitionMap.put("/**", "jwt");
Map<String, Filter> filterMap = new HashMap<String, Filter>(2);
filterMap.put("jwt", new JwtFilter(cloudServer==null));
filterMap.put("applet", new AppletJwtFilter(cloudServer==null));
JwtToken
,小程序使用AppletJwtToken
ShiroRealm
,小程序使用AppletShiroRealm
/applet/**
必须在 /**
之前配置小程序接口:
/applet/health/health
应该能正常访问(有@IgnoreAuth注解)/applet/user/info
需要AppletJwtToken认证后台接口:
/sys/user/list
需要JwtToken认证/sys/login
不需要认证(在anon列表中)Token隔离: