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

4.5 KiB

小程序登录拦截器分离配置说明

配置目标

将系统的登录拦截器分成后台管理系统和小程序两个独立的拦截器,实现不同的认证策略。

实现方案

1. 创建小程序专用拦截器

1.1 新增文件

  • jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/filters/AppletJwtFilter.java

1.2 核心特性

@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 配置变更

// 添加自己的过滤器并且取名为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. 小程序免登录接口

@GetMapping("/health")
@IgnoreAuth
@Operation(summary = "健康检查", description = "检查健康管理小程序模块运行状态")
public Result<String> health() {
    return Result.OK("健康管理小程序模块运行正常");
}

2. 小程序需要登录的接口

@GetMapping("/user/info")
@Operation(summary = "获取用户信息", description = "获取小程序用户信息")
public Result<UserInfo> getUserInfo() {
    // 需要登录才能访问
    return Result.OK(userInfo);
}

3. 后台管理接口

@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接口文档"