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

6.1 KiB

小程序和后台不同Token配置说明

配置目标

为小程序和后台管理系统配置不同的Token解析对象,实现独立的认证体系。

实现方案

1. 创建小程序专用Token类

1.1 新增文件

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

1.2 核心特性

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 核心特性

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

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

@Bean("appletSecurityManager")
public DefaultWebSecurityManager appletSecurityManager(AppletShiroRealm appletRealm) {
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
    securityManager.setRealm(appletRealm);
    // 配置小程序专用的SecurityManager
    return securityManager;
}

Token解析对象分离效果

1. 后台管理系统Token (JwtToken)

  • Token类JwtToken
  • RealmShiroRealm
  • SecurityManagersecurityManager
  • 适用场景:后台管理系统的所有接口

2. 小程序Token (AppletJwtToken)

  • Token类AppletJwtToken
  • RealmAppletShiroRealm
  • SecurityManagerappletSecurityManager
  • 适用场景:小程序相关的所有接口

配置优势

1. 独立认证体系

  • 后台和小程序使用不同的Token类
  • 可以配置不同的认证逻辑
  • 支持不同的用户体系和权限模型

2. 更好的安全性

  • 小程序和后台的认证完全隔离
  • 可以针对小程序特点定制安全策略
  • 减少攻击面和风险

3. 便于维护和扩展

  • 小程序相关的认证逻辑独立管理
  • 可以独立升级和配置
  • 便于调试和问题排查

使用示例

1. 小程序接口(使用AppletJwtToken)

@GetMapping("/user/info")
@Operation(summary = "获取小程序用户信息")
public Result<UserInfo> getAppletUserInfo() {
    // 使用AppletJwtToken进行认证
    // 通过AppletShiroRealm进行权限验证
    return Result.OK(userInfo);
}

2. 后台接口(使用JwtToken)

@GetMapping("/sys/user/list")
@Operation(summary = "获取后台用户列表")
public Result<IPage<SysUser>> getBackendUserList() {
    // 使用JwtToken进行认证
    // 通过ShiroRealm进行权限验证
    return Result.OK(userList);
}

3. 小程序免登录接口

@GetMapping("/health")
@IgnoreAuth
@Operation(summary = "健康检查")
public Result<String> health() {
    // 使用@IgnoreAuth注解,跳过认证
    return Result.OK("健康管理小程序模块运行正常");
}

拦截器配置

1. 路径匹配规则

// applet专用过滤器,只处理/applet开头的请求
filterChainDefinitionMap.put("/applet/**", "applet");
// 其他请求使用jwt过滤器
filterChainDefinitionMap.put("/**", "jwt");

2. 过滤器配置

Map<String, Filter> filterMap = new HashMap<String, Filter>(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. 不同的用户体系:可以为小程序配置独立的用户表和管理逻辑