普兆健康管家后端代码仓库
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.

143 lines
4.5 KiB

  1. # 小程序登录拦截器分离配置说明
  2. ## 配置目标
  3. 将系统的登录拦截器分成后台管理系统和小程序两个独立的拦截器,实现不同的认证策略。
  4. ## 实现方案
  5. ### 1. 创建小程序专用拦截器
  6. #### 1.1 新增文件
  7. - `jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/filters/AppletJwtFilter.java`
  8. #### 1.2 核心特性
  9. ```java
  10. @Override
  11. protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
  12. try {
  13. HttpServletRequest httpRequest = (HttpServletRequest) request;
  14. String requestPath = httpRequest.getServletPath();
  15. // 只处理以/applet开头的请求
  16. if (!requestPath.startsWith("/applet")) {
  17. return true; // 不是applet请求,直接放行
  18. }
  19. // 判断当前路径是不是注解了@IngoreAuth路径,如果是,则放开验证
  20. if (InMemoryIgnoreAuth.contains(requestPath)) {
  21. return true;
  22. }
  23. executeLogin(request, response);
  24. return true;
  25. } catch (Exception e) {
  26. JwtUtil.responseError(response,401,CommonConstant.TOKEN_IS_INVALID_MSG);
  27. return false;
  28. }
  29. }
  30. ```
  31. ### 2. 修改Shiro配置
  32. #### 2.1 修改文件
  33. - `jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java`
  34. #### 2.2 配置变更
  35. ```java
  36. // 添加自己的过滤器并且取名为jwt和applet
  37. Map<String, Filter> filterMap = new HashMap<String, Filter>(2);
  38. //如果cloudServer为空 则说明是单体 需要加载跨域配置【微服务跨域切换】
  39. Object cloudServer = env.getProperty(CommonConstant.CLOUD_SERVER_KEY);
  40. filterMap.put("jwt", new JwtFilter(cloudServer==null));
  41. filterMap.put("applet", new AppletJwtFilter(cloudServer==null));
  42. shiroFilterFactoryBean.setFilters(filterMap);
  43. // <!-- 过滤链定义,从上向下顺序执行
  44. // applet专用过滤器,只处理/applet开头的请求
  45. filterChainDefinitionMap.put("/applet/**", "applet");
  46. // 其他请求使用jwt过滤器
  47. filterChainDefinitionMap.put("/**", "jwt");
  48. ```
  49. ## 拦截器分离效果
  50. ### 1. 后台管理系统拦截器 (JwtFilter)
  51. - **作用范围**:除了`/applet/**`之外的所有请求
  52. - **认证策略**:标准的JWT Token认证
  53. - **适用场景**:后台管理系统的所有接口
  54. ### 2. 小程序拦截器 (AppletJwtFilter)
  55. - **作用范围**:只处理`/applet/**`开头的请求
  56. - **认证策略**:
  57. - 支持`@IgnoreAuth`注解的免登录接口
  58. - 其他接口需要JWT Token认证
  59. - **适用场景**:小程序相关的所有接口
  60. ## 配置优势
  61. ### 1. 独立认证策略
  62. - 后台和小程序可以使用不同的认证方式
  63. - 可以为小程序配置更宽松的认证策略
  64. - 支持不同的Token格式和验证逻辑
  65. ### 2. 更好的安全性
  66. - 小程序接口与后台接口完全隔离
  67. - 可以针对小程序特点定制安全策略
  68. - 减少攻击面
  69. ### 3. 便于维护
  70. - 小程序相关的认证逻辑独立管理
  71. - 可以独立升级和配置
  72. - 便于调试和问题排查
  73. ## 使用示例
  74. ### 1. 小程序免登录接口
  75. ```java
  76. @GetMapping("/health")
  77. @IgnoreAuth
  78. @Operation(summary = "健康检查", description = "检查健康管理小程序模块运行状态")
  79. public Result<String> health() {
  80. return Result.OK("健康管理小程序模块运行正常");
  81. }
  82. ```
  83. ### 2. 小程序需要登录的接口
  84. ```java
  85. @GetMapping("/user/info")
  86. @Operation(summary = "获取用户信息", description = "获取小程序用户信息")
  87. public Result<UserInfo> getUserInfo() {
  88. // 需要登录才能访问
  89. return Result.OK(userInfo);
  90. }
  91. ```
  92. ### 3. 后台管理接口
  93. ```java
  94. @GetMapping("/sys/user/list")
  95. @Operation(summary = "用户列表", description = "获取后台用户列表")
  96. public Result<IPage<SysUser>> getUserList() {
  97. // 使用标准的后台认证
  98. return Result.OK(userList);
  99. }
  100. ```
  101. ## 注意事项
  102. 1. **路径匹配顺序**:`/applet/**` 必须在 `/**` 之前配置
  103. 2. **跨域支持**:两个拦截器都支持跨域配置
  104. 3. **多租户支持**:都支持多租户的TenantContext
  105. 4. **异步支持**:如果需要异步支持,需要在FilterRegistrationBean中配置
  106. ## 验证方法
  107. 1. **小程序接口**
  108. - 访问 `/applet/health/health` 应该能正常访问(有@IgnoreAuth注解)
  109. - 访问 `/applet/user/info` 需要Token认证
  110. 2. **后台接口**
  111. - 访问 `/sys/user/list` 需要Token认证
  112. - 访问 `/sys/login` 不需要认证(在anon列表中)
  113. 3. **Swagger文档**
  114. - 只显示 `/applet` 开头的接口
  115. - 文档标题已更新为"小程序API接口文档"