普兆健康管家后端代码仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

215 lines
6.1 KiB

  1. # 小程序和后台不同Token配置说明
  2. ## 配置目标
  3. 为小程序和后台管理系统配置不同的Token解析对象,实现独立的认证体系。
  4. ## 实现方案
  5. ### 1. 创建小程序专用Token类
  6. #### 1.1 新增文件
  7. - `jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/AppletJwtToken.java`
  8. #### 1.2 核心特性
  9. ```java
  10. public class AppletJwtToken implements AuthenticationToken {
  11. private String token;
  12. public AppletJwtToken(String token) {
  13. this.token = token;
  14. }
  15. @Override
  16. public Object getPrincipal() {
  17. return token;
  18. }
  19. @Override
  20. public Object getCredentials() {
  21. return token;
  22. }
  23. }
  24. ```
  25. ### 2. 创建小程序专用Realm
  26. #### 2.1 新增文件
  27. - `jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/AppletShiroRealm.java`
  28. #### 2.2 核心特性
  29. ```java
  30. @Component
  31. @Slf4j
  32. public class AppletShiroRealm extends AuthorizingRealm {
  33. @Override
  34. public boolean supports(AuthenticationToken token) {
  35. return token instanceof AppletJwtToken;
  36. }
  37. @Override
  38. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken auth) throws AuthenticationException {
  39. // 小程序专用的身份认证逻辑
  40. String token = (String) auth.getCredentials();
  41. LoginUser loginUser = this.checkAppletUserTokenIsEffect(token);
  42. return new SimpleAuthenticationInfo(loginUser, token, getName());
  43. }
  44. @Override
  45. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
  46. // 小程序专用的权限认证逻辑
  47. // 可以配置不同的角色和权限体系
  48. return info;
  49. }
  50. }
  51. ```
  52. ### 3. 修改小程序拦截器
  53. #### 3.1 修改文件
  54. - `jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/AppletJwtFilter.java`
  55. #### 3.2 配置变更
  56. ```java
  57. @Slf4j
  58. public class AppletJwtFilter extends BasicHttpAuthenticationFilter {
  59. @Resource
  60. private AppletShiroRealm appletRealm;
  61. @Override
  62. protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception {
  63. // 使用小程序专用的Token和Realm
  64. AppletJwtToken jwtToken = new AppletJwtToken(token);
  65. getSubject(request, response).login(jwtToken);
  66. return true;
  67. }
  68. }
  69. ```
  70. ### 4. 配置独立的SecurityManager
  71. #### 4.1 修改文件
  72. - `jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java`
  73. #### 4.2 配置变更
  74. ```java
  75. @Bean("appletSecurityManager")
  76. public DefaultWebSecurityManager appletSecurityManager(AppletShiroRealm appletRealm) {
  77. DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
  78. securityManager.setRealm(appletRealm);
  79. // 配置小程序专用的SecurityManager
  80. return securityManager;
  81. }
  82. ```
  83. ## Token解析对象分离效果
  84. ### 1. 后台管理系统Token (JwtToken)
  85. - **Token类**:`JwtToken`
  86. - **Realm**:`ShiroRealm`
  87. - **SecurityManager**:`securityManager`
  88. - **适用场景**:后台管理系统的所有接口
  89. ### 2. 小程序Token (AppletJwtToken)
  90. - **Token类**:`AppletJwtToken`
  91. - **Realm**:`AppletShiroRealm`
  92. - **SecurityManager**:`appletSecurityManager`
  93. - **适用场景**:小程序相关的所有接口
  94. ## 配置优势
  95. ### 1. 独立认证体系
  96. - 后台和小程序使用不同的Token类
  97. - 可以配置不同的认证逻辑
  98. - 支持不同的用户体系和权限模型
  99. ### 2. 更好的安全性
  100. - 小程序和后台的认证完全隔离
  101. - 可以针对小程序特点定制安全策略
  102. - 减少攻击面和风险
  103. ### 3. 便于维护和扩展
  104. - 小程序相关的认证逻辑独立管理
  105. - 可以独立升级和配置
  106. - 便于调试和问题排查
  107. ## 使用示例
  108. ### 1. 小程序接口(使用AppletJwtToken)
  109. ```java
  110. @GetMapping("/user/info")
  111. @Operation(summary = "获取小程序用户信息")
  112. public Result<UserInfo> getAppletUserInfo() {
  113. // 使用AppletJwtToken进行认证
  114. // 通过AppletShiroRealm进行权限验证
  115. return Result.OK(userInfo);
  116. }
  117. ```
  118. ### 2. 后台接口(使用JwtToken)
  119. ```java
  120. @GetMapping("/sys/user/list")
  121. @Operation(summary = "获取后台用户列表")
  122. public Result<IPage<SysUser>> getBackendUserList() {
  123. // 使用JwtToken进行认证
  124. // 通过ShiroRealm进行权限验证
  125. return Result.OK(userList);
  126. }
  127. ```
  128. ### 3. 小程序免登录接口
  129. ```java
  130. @GetMapping("/health")
  131. @IgnoreAuth
  132. @Operation(summary = "健康检查")
  133. public Result<String> health() {
  134. // 使用@IgnoreAuth注解,跳过认证
  135. return Result.OK("健康管理小程序模块运行正常");
  136. }
  137. ```
  138. ## 拦截器配置
  139. ### 1. 路径匹配规则
  140. ```java
  141. // applet专用过滤器,只处理/applet开头的请求
  142. filterChainDefinitionMap.put("/applet/**", "applet");
  143. // 其他请求使用jwt过滤器
  144. filterChainDefinitionMap.put("/**", "jwt");
  145. ```
  146. ### 2. 过滤器配置
  147. ```java
  148. Map<String, Filter> filterMap = new HashMap<String, Filter>(2);
  149. filterMap.put("jwt", new JwtFilter(cloudServer==null));
  150. filterMap.put("applet", new AppletJwtFilter(cloudServer==null));
  151. ```
  152. ## 注意事项
  153. 1. **Token类型隔离**:后台使用`JwtToken`,小程序使用`AppletJwtToken`
  154. 2. **Realm隔离**:后台使用`ShiroRealm`,小程序使用`AppletShiroRealm`
  155. 3. **路径匹配顺序**:`/applet/**` 必须在 `/**` 之前配置
  156. 4. **跨域支持**:两个拦截器都支持跨域配置
  157. 5. **多租户支持**:都支持多租户的TenantContext
  158. ## 验证方法
  159. 1. **小程序接口**
  160. - 访问 `/applet/health/health` 应该能正常访问(有@IgnoreAuth注解)
  161. - 访问 `/applet/user/info` 需要AppletJwtToken认证
  162. 2. **后台接口**
  163. - 访问 `/sys/user/list` 需要JwtToken认证
  164. - 访问 `/sys/login` 不需要认证(在anon列表中)
  165. 3. **Token隔离**
  166. - 后台Token无法用于小程序接口
  167. - 小程序Token无法用于后台接口
  168. ## 扩展建议
  169. 1. **不同的Token格式**:可以为小程序和后台配置不同的JWT签名算法
  170. 2. **不同的权限模型**:可以为小程序配置更简单的权限体系
  171. 3. **不同的缓存策略**:可以为小程序配置不同的Token缓存时间
  172. 4. **不同的用户体系**:可以为小程序配置独立的用户表和管理逻辑