首页
/ Sa-Token实现固定Token免登录访问的技术方案

Sa-Token实现固定Token免登录访问的技术方案

2025-05-12 11:28:28作者:羿妍玫Ivan

背景与需求分析

在基于Sa-Token的权限管理系统中,常规的登录流程是通过前端提交账号密码,后端使用StpUtil.login(userId)完成登录认证。然而,在实际业务场景中,我们经常会遇到需要为特定用户配置永久有效的访问凭证的需求。

这种需求常见于以下场景:

  1. 系统间API调用需要长期有效的访问凭证
  2. 特殊用户需要免登录直接访问系统
  3. 自动化脚本或定时任务需要固定凭证访问资源

技术实现方案

核心思路

Sa-Token本身不直接支持固定Token的功能,但我们可以通过拦截器机制实现类似效果。核心思路是:当检测到特定Token时,自动完成用户登录流程,而无需用户主动提交认证信息。

具体实现步骤

  1. 定义固定Token存储机制 建议将固定Token与用户ID的映射关系存储在数据库或配置文件中,例如:

    # 固定Token配置示例
    fixed.token.user1=token1_value
    fixed.token.user2=token2_value
    
  2. 实现自定义拦截器 通过Spring的拦截器机制,在请求到达控制器前进行Token验证:

@Configuration
public class SaTokenConfig implements WebMvcConfigurer {
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SaInterceptor(handler -> {
            // 获取当前请求的Token
            String currentToken = StpUtil.getTokenValue();
            
            // 检查是否为固定Token
            if (!StpUtil.isLogin() && isFixedToken(currentToken)) {
                // 根据Token获取对应用户ID
                String userId = getUserIdByFixedToken(currentToken);
                
                // 自动登录用户,并保持原始Token
                StpUtil.login(userId, new SaLoginModel().setToken(currentToken));
            }
            
            // 执行常规登录检查
            StpUtil.checkLogin();
        })).addPathPatterns("/**");
    }
    
    private boolean isFixedToken(String token) {
        // 实现固定Token的验证逻辑
        // 可以从数据库或配置文件中查询
        return fixedTokenService.isFixedToken(token);
    }
    
    private String getUserIdByFixedToken(String token) {
        // 根据固定Token获取用户ID
        return fixedTokenService.getUserIdByToken(token);
    }
}
  1. Token管理服务 建议创建一个专门的服务类来管理固定Token:
@Service
public class FixedTokenService {
    
    @Value("${fixed.token.user1}")
    private String user1Token;
    
    @Value("${fixed.token.user2}")
    private String user2Token;
    
    public boolean isFixedToken(String token) {
        return user1Token.equals(token) || user2Token.equals(token);
    }
    
    public String getUserIdByToken(String token) {
        if (user1Token.equals(token)) {
            return "user1";
        } else if (user2Token.equals(token)) {
            return "user2";
        }
        return null;
    }
}

安全注意事项

  1. Token保护:固定Token相当于长期有效的密码,必须严格保管
  2. 权限控制:建议为固定Token分配最小必要权限
  3. 监控审计:记录固定Token的使用情况,便于异常时及时撤销
  4. 定期更换:虽然称为"永久"Token,但仍建议定期轮换

扩展方案

对于更复杂的需求,可以考虑以下增强方案:

  1. Token白名单机制:在数据库中维护Token白名单表
  2. 动态Token失效:支持管理员主动使特定Token失效
  3. 使用频率限制:对固定Token的访问频率进行限制
  4. 绑定IP限制:将固定Token与特定IP地址绑定

总结

通过Sa-Token的拦截器机制,我们实现了固定Token免登录访问的功能。这种方案既保持了Sa-Token原有的简洁API风格,又扩展了其应用场景。在实际项目中,开发者可以根据具体需求调整实现细节,确保系统安全性的同时提供便捷的访问方式。

登录后查看全文
热门项目推荐
相关项目推荐