# 小程序和后台不同Token配置说明 ## 配置目标 为小程序和后台管理系统配置不同的Token解析对象,实现独立的认证体系。 ## 实现方案 ### 1. 创建小程序专用Token类 #### 1.1 新增文件 - `jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/AppletJwtToken.java` #### 1.2 核心特性 ```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; } } ``` ### 2. 创建小程序专用Realm #### 2.1 新增文件 - `jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/AppletShiroRealm.java` #### 2.2 核心特性 ```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; } } ``` ### 3. 修改小程序拦截器 #### 3.1 修改文件 - `jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/AppletJwtFilter.java` #### 3.2 配置变更 ```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; } } ``` ### 4. 配置独立的SecurityManager #### 4.1 修改文件 - `jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java` #### 4.2 配置变更 ```java @Bean("appletSecurityManager") public DefaultWebSecurityManager appletSecurityManager(AppletShiroRealm appletRealm) { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealm(appletRealm); // 配置小程序专用的SecurityManager return securityManager; } ``` ## Token解析对象分离效果 ### 1. 后台管理系统Token (JwtToken) - **Token类**:`JwtToken` - **Realm**:`ShiroRealm` - **SecurityManager**:`securityManager` - **适用场景**:后台管理系统的所有接口 ### 2. 小程序Token (AppletJwtToken) - **Token类**:`AppletJwtToken` - **Realm**:`AppletShiroRealm` - **SecurityManager**:`appletSecurityManager` - **适用场景**:小程序相关的所有接口 ## 配置优势 ### 1. 独立认证体系 - 后台和小程序使用不同的Token类 - 可以配置不同的认证逻辑 - 支持不同的用户体系和权限模型 ### 2. 更好的安全性 - 小程序和后台的认证完全隔离 - 可以针对小程序特点定制安全策略 - 减少攻击面和风险 ### 3. 便于维护和扩展 - 小程序相关的认证逻辑独立管理 - 可以独立升级和配置 - 便于调试和问题排查 ## 使用示例 ### 1. 小程序接口(使用AppletJwtToken) ```java @GetMapping("/user/info") @Operation(summary = "获取小程序用户信息") public Result getAppletUserInfo() { // 使用AppletJwtToken进行认证 // 通过AppletShiroRealm进行权限验证 return Result.OK(userInfo); } ``` ### 2. 后台接口(使用JwtToken) ```java @GetMapping("/sys/user/list") @Operation(summary = "获取后台用户列表") public Result> getBackendUserList() { // 使用JwtToken进行认证 // 通过ShiroRealm进行权限验证 return Result.OK(userList); } ``` ### 3. 小程序免登录接口 ```java @GetMapping("/health") @IgnoreAuth @Operation(summary = "健康检查") public Result health() { // 使用@IgnoreAuth注解,跳过认证 return Result.OK("健康管理小程序模块运行正常"); } ``` ## 拦截器配置 ### 1. 路径匹配规则 ```java // applet专用过滤器,只处理/applet开头的请求 filterChainDefinitionMap.put("/applet/**", "applet"); // 其他请求使用jwt过滤器 filterChainDefinitionMap.put("/**", "jwt"); ``` ### 2. 过滤器配置 ```java Map filterMap = new HashMap(2); filterMap.put("jwt", new JwtFilter(cloudServer==null)); filterMap.put("applet", new AppletJwtFilter(cloudServer==null)); ``` ## 注意事项 1. **Token类型隔离**:后台使用`JwtToken`,小程序使用`AppletJwtToken` 2. **Realm隔离**:后台使用`ShiroRealm`,小程序使用`AppletShiroRealm` 3. **路径匹配顺序**:`/applet/**` 必须在 `/**` 之前配置 4. **跨域支持**:两个拦截器都支持跨域配置 5. **多租户支持**:都支持多租户的TenantContext ## 验证方法 1. **小程序接口**: - 访问 `/applet/health/health` 应该能正常访问(有@IgnoreAuth注解) - 访问 `/applet/user/info` 需要AppletJwtToken认证 2. **后台接口**: - 访问 `/sys/user/list` 需要JwtToken认证 - 访问 `/sys/login` 不需要认证(在anon列表中) 3. **Token隔离**: - 后台Token无法用于小程序接口 - 小程序Token无法用于后台接口 ## 扩展建议 1. **不同的Token格式**:可以为小程序和后台配置不同的JWT签名算法 2. **不同的权限模型**:可以为小程序配置更简单的权限体系 3. **不同的缓存策略**:可以为小程序配置不同的Token缓存时间 4. **不同的用户体系**:可以为小程序配置独立的用户表和管理逻辑