|
|
- # 小程序和后台不同Token配置说明
-
- ## 配置目标
- 为小程序和后台管理系统配置不同的Token解析对象,实现独立的认证体系。
-
- ## 实现方案
-
- ### 1. 创建小程序专用Token类
-
- #### 1.1 新增文件
- - `jeecg-boot/jeecg-boot-base-core/src/main/java/org/jeecg/config/shiro/AppletJwtToken.java`
-
- #### 1.2 核心特性
- ```java
- 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 核心特性
- ```java
- @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 配置变更
- ```java
- @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 配置变更
- ```java
- @Bean("appletSecurityManager")
- public DefaultWebSecurityManager appletSecurityManager(AppletShiroRealm appletRealm) {
- DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
- securityManager.setRealm(appletRealm);
- // 配置小程序专用的SecurityManager
- return securityManager;
- }
- ```
-
- ## Token解析对象分离效果
-
- ### 1. 后台管理系统Token (JwtToken)
- - **Token类**:`JwtToken`
- - **Realm**:`ShiroRealm`
- - **SecurityManager**:`securityManager`
- - **适用场景**:后台管理系统的所有接口
-
- ### 2. 小程序Token (AppletJwtToken)
- - **Token类**:`AppletJwtToken`
- - **Realm**:`AppletShiroRealm`
- - **SecurityManager**:`appletSecurityManager`
- - **适用场景**:小程序相关的所有接口
-
- ## 配置优势
-
- ### 1. 独立认证体系
- - 后台和小程序使用不同的Token类
- - 可以配置不同的认证逻辑
- - 支持不同的用户体系和权限模型
-
- ### 2. 更好的安全性
- - 小程序和后台的认证完全隔离
- - 可以针对小程序特点定制安全策略
- - 减少攻击面和风险
-
- ### 3. 便于维护和扩展
- - 小程序相关的认证逻辑独立管理
- - 可以独立升级和配置
- - 便于调试和问题排查
-
- ## 使用示例
-
- ### 1. 小程序接口(使用AppletJwtToken)
- ```java
- @GetMapping("/user/info")
- @Operation(summary = "获取小程序用户信息")
- public Result<UserInfo> getAppletUserInfo() {
- // 使用AppletJwtToken进行认证
- // 通过AppletShiroRealm进行权限验证
- return Result.OK(userInfo);
- }
- ```
-
- ### 2. 后台接口(使用JwtToken)
- ```java
- @GetMapping("/sys/user/list")
- @Operation(summary = "获取后台用户列表")
- public Result<IPage<SysUser>> getBackendUserList() {
- // 使用JwtToken进行认证
- // 通过ShiroRealm进行权限验证
- return Result.OK(userList);
- }
- ```
-
- ### 3. 小程序免登录接口
- ```java
- @GetMapping("/health")
- @IgnoreAuth
- @Operation(summary = "健康检查")
- public Result<String> health() {
- // 使用@IgnoreAuth注解,跳过认证
- return Result.OK("健康管理小程序模块运行正常");
- }
- ```
-
- ## 拦截器配置
-
- ### 1. 路径匹配规则
- ```java
- // applet专用过滤器,只处理/applet开头的请求
- filterChainDefinitionMap.put("/applet/**", "applet");
- // 其他请求使用jwt过滤器
- filterChainDefinitionMap.put("/**", "jwt");
- ```
-
- ### 2. 过滤器配置
- ```java
- 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. **不同的用户体系**:可以为小程序配置独立的用户表和管理逻辑
|