手把手教你用 Sa-Token 实现登录鉴权和权限控制(入门实战篇)

1,342 阅读3分钟

一、什么是 Sa-Token?

Sa-Token 是一个轻量级的 Java 权限认证框架,核心功能包括:

  • 登录认证(Login)
  • 权限认证(Permission)
  • 会话管理(Session)
  • 踢人下线(Kickout)
  • 角色控制(Role)
  • 多账号体系(Multiple Realm)

对比 Spring Security,它更轻量、配置更简单、API 更易用,非常适合快速开发场景。


二、快速集成 Sa-Token(Spring Boot 项目)

1. 添加依赖

<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot-starter</artifactId>
    <version>1.34.0</version>
</dependency>

最新版本请以官网为准。


2. 配置 application.yml

sa-token:
  # token 名称(同时也是 cookie 名称)
  token-name: App-Token
  # token 有效期(单位:秒) 默认30天,-1 代表永久有效
  timeout: 2592000
  # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
  active-timeout: -1
  # 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
  is-concurrent: false
  # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)
  is-share: true
  # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
  token-style: uuid
  # 是否输出操作日志
  is-log: true

3. 编写登录接口

@RestController
@RequestMapping("/user")
public class UserController {

    @PostMapping("/login")
    public String doLogin(@RequestParam String username, @RequestParam String password) {
        if("admin".equals(username) && "123456".equals(password)) {
            // 登录成功,写入 token
            StpUtil.login(10001); // 10001为模拟用户id
            return "登录成功,Token:" + StpUtil.getTokenValue();
        }
        return "账号密码错误";
    }
}

4. 权限控制示例

方式一:注解拦截权限
@SaCheckPermission("user:add")
@GetMapping("/add")
public String addUser() {
    return "添加用户成功";
}
方式二:手动校验
@GetMapping("/delete")
public String deleteUser() {
    StpUtil.checkPermission("user:delete");
    return "删除用户成功";
}

三、退出登录和用户状态控制

@GetMapping("/logout")
public String logout() {
    StpUtil.logout();
    return "已退出登录";
}

四、权限设计建议

建议在用户登录后,将权限列表存入 Session 或缓存中(如 Redis),Sa-Token 的权限校验支持:

  • 注解式校验(最常用)
  • 编程式校验(业务灵活控制)

你还可以结合 RBAC 模型,用角色 + 权限组合实现更加细粒度的权限控制。


五、手动添加拦截器

@Configuration
public class SaTokenConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册 Sa-Token 拦截器,定义详细认证规则
        registry.addInterceptor(new SaInterceptor(handler -> {
            // 指定一条 match 规则
            SaRouter
                    .match("/**")                   // 拦截的 path 列表,可以写多个 */
                    .notMatch("/system/login")      // 排除掉的 path 列表,可以写多个
                    .check(r -> StpUtil.checkLogin());       // 要执行的校验动作,可以写完整的 lambda 表达式
        })).addPathPatterns("/**");
    }
}

六、总结

Sa-Token 是一个优秀的权限框架,适用于对安全性有要求但不需要 Spring Security 那么重的项目,特别适合:

  • 后台管理系统
  • 小程序接口后端
  • 独立中台服务

优点总结:

  • 上手快,API 简单直观
  • 支持多端登录、单点登录、Token 续签等高级功能
  • 适配 Spring Boot 无缝集成

Sa-Token 官方文档: sa-token.cc


如果你对权限设计、Token 管理、接口安全有兴趣,欢迎点赞、收藏、评论区交流!