|
|
- # 小程序登录拦截器分离配置说明
-
- ## 配置目标
- 将系统的登录拦截器分成后台管理系统和小程序两个独立的拦截器,实现不同的认证策略。
-
- ## 实现方案
-
- ### 1. 创建小程序专用拦截器
-
- #### 1.1 新增文件
- - `jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/filters/AppletJwtFilter.java`
-
- #### 1.2 核心特性
- ```java
- @Override
- protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
- try {
- HttpServletRequest httpRequest = (HttpServletRequest) request;
- String requestPath = httpRequest.getServletPath();
-
- // 只处理以/applet开头的请求
- if (!requestPath.startsWith("/applet")) {
- return true; // 不是applet请求,直接放行
- }
-
- // 判断当前路径是不是注解了@IngoreAuth路径,如果是,则放开验证
- if (InMemoryIgnoreAuth.contains(requestPath)) {
- return true;
- }
-
- executeLogin(request, response);
- return true;
- } catch (Exception e) {
- JwtUtil.responseError(response,401,CommonConstant.TOKEN_IS_INVALID_MSG);
- return false;
- }
- }
- ```
-
- ### 2. 修改Shiro配置
-
- #### 2.1 修改文件
- - `jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java`
-
- #### 2.2 配置变更
- ```java
- // 添加自己的过滤器并且取名为jwt和applet
- Map<String, Filter> filterMap = new HashMap<String, Filter>(2);
- //如果cloudServer为空 则说明是单体 需要加载跨域配置【微服务跨域切换】
- Object cloudServer = env.getProperty(CommonConstant.CLOUD_SERVER_KEY);
- filterMap.put("jwt", new JwtFilter(cloudServer==null));
- filterMap.put("applet", new AppletJwtFilter(cloudServer==null));
- shiroFilterFactoryBean.setFilters(filterMap);
-
- // <!-- 过滤链定义,从上向下顺序执行
- // applet专用过滤器,只处理/applet开头的请求
- filterChainDefinitionMap.put("/applet/**", "applet");
- // 其他请求使用jwt过滤器
- filterChainDefinitionMap.put("/**", "jwt");
- ```
-
- ## 拦截器分离效果
-
- ### 1. 后台管理系统拦截器 (JwtFilter)
- - **作用范围**:除了`/applet/**`之外的所有请求
- - **认证策略**:标准的JWT Token认证
- - **适用场景**:后台管理系统的所有接口
-
- ### 2. 小程序拦截器 (AppletJwtFilter)
- - **作用范围**:只处理`/applet/**`开头的请求
- - **认证策略**:
- - 支持`@IgnoreAuth`注解的免登录接口
- - 其他接口需要JWT Token认证
- - **适用场景**:小程序相关的所有接口
-
- ## 配置优势
-
- ### 1. 独立认证策略
- - 后台和小程序可以使用不同的认证方式
- - 可以为小程序配置更宽松的认证策略
- - 支持不同的Token格式和验证逻辑
-
- ### 2. 更好的安全性
- - 小程序接口与后台接口完全隔离
- - 可以针对小程序特点定制安全策略
- - 减少攻击面
-
- ### 3. 便于维护
- - 小程序相关的认证逻辑独立管理
- - 可以独立升级和配置
- - 便于调试和问题排查
-
- ## 使用示例
-
- ### 1. 小程序免登录接口
- ```java
- @GetMapping("/health")
- @IgnoreAuth
- @Operation(summary = "健康检查", description = "检查健康管理小程序模块运行状态")
- public Result<String> health() {
- return Result.OK("健康管理小程序模块运行正常");
- }
- ```
-
- ### 2. 小程序需要登录的接口
- ```java
- @GetMapping("/user/info")
- @Operation(summary = "获取用户信息", description = "获取小程序用户信息")
- public Result<UserInfo> getUserInfo() {
- // 需要登录才能访问
- return Result.OK(userInfo);
- }
- ```
-
- ### 3. 后台管理接口
- ```java
- @GetMapping("/sys/user/list")
- @Operation(summary = "用户列表", description = "获取后台用户列表")
- public Result<IPage<SysUser>> getUserList() {
- // 使用标准的后台认证
- return Result.OK(userList);
- }
- ```
-
- ## 注意事项
-
- 1. **路径匹配顺序**:`/applet/**` 必须在 `/**` 之前配置
- 2. **跨域支持**:两个拦截器都支持跨域配置
- 3. **多租户支持**:都支持多租户的TenantContext
- 4. **异步支持**:如果需要异步支持,需要在FilterRegistrationBean中配置
-
- ## 验证方法
-
- 1. **小程序接口**:
- - 访问 `/applet/health/health` 应该能正常访问(有@IgnoreAuth注解)
- - 访问 `/applet/user/info` 需要Token认证
-
- 2. **后台接口**:
- - 访问 `/sys/user/list` 需要Token认证
- - 访问 `/sys/login` 不需要认证(在anon列表中)
-
- 3. **Swagger文档**:
- - 只显示 `/applet` 开头的接口
- - 文档标题已更新为"小程序API接口文档"
|