Sa-Token 一个轻量级Java权限验证框架

1,438 阅读2分钟

Sa-Token是一个轻量级Java权限验证框架。它不仅支持SpringBoot等主流框架,也可以适配Servlet、JFinal等非主流框架。Sa-Token可以用于身份验证、角色权限验证、API接口鉴权等场景。本文将重点介绍在SpringBoot框架中如何使用Sa-Token进行身份验证和角色权限验证。

一、环境搭建

首先,需要在pom.xml文件中添加Sa-Token的依赖:

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

其中x.x.x为最新发布版本号。

然后,在SpringBoot项目的application.yml(或application.properties)文件中进行配置:

# Sa-Token 配置
sa-token:
  config:
    tokenName: SATOKEN                         # token名称 (同时也是cookie名称)
    tokenValueStyle: uuid                     # token值的风格:uuid、simple
    isV                       : true           # 是否在初始化时自动检查Sa-Token配置
    isHijack                  : true           # 是否开启防护伪造Sa-Token请求头功能
    isAutoRenew               : true           # 是否开启自动续签,每次操作都刷新token的最后访问时间戳
    isSingleton               : false          # 是否单例模式运行(即一个jvm进程只有一个Sa-Token容器)
    timeout                   : 3600           # token过期时间(单位:秒),-1表示永不过期
    persistence               : "sa-file"      # 持久层封装类的Bean名称(只需要填写Bean名称,即可实现持久层存储)

二、身份验证

在Sa-Token中,可以使用 LoginUtil 来进行登录操作。该工具类提供了多种登录方式,包括账号密码登录、二维码登录、微信登录等。

以下是一个简单的账号密码登录示例:

@RestController
@RequestMapping("/auth")
public class AuthController {

  /**
   * 用户名密码登录
   */
  @PostMapping("/login")
  public Map<String, Object> login(String username, String password) {
    try {
      // 登录
      LoginUtil.login(username, password);
      // 创建返回结果
      Map<String, Object> result = new HashMap<>();
      result.put("code", 200);
      result.put("msg", "登录成功");
      return result;
    } catch (NotLoginException e) {
      e.printStackTrace();
      throw new RuntimeException("登录失败");
    }
  }

}

上面的示例中,我们在AuthController中创建了一个 /auth/login 接口,用于处理账号密码登录请求。LoginUtil.login()方法会根据传入的用户名和密码进行身份验证,并返回一个token值。

当登录成功后,我们可以在接口调用的其他方法中获取当前用户信息:

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

  /**
   * 获取用户信息
   */
  @GetMapping("/info")
  public Map<String, Object> getInfo() {
    // 获取当前用户id
    String userId = SaTokenManager.getUserId();
    // 创建返回结果
    Map<String, Object> result = new HashMap<>();
    result.put("code", 200);
    result.put("msg", "获取用户信息成功");
    result.put("data", userId);
    return result;
  }

}

上面的示例中,我们创建了一个/user/info接口,用于获取当前登录用户的id。其中SaTokenManager.getUserId()方法可以获取当前用户id。

三、角色权限验证

在Sa-Token中,可以使用@SaCheckPermission和@SaCheckRole注解来进行角色权限验证。这两个注解可以分别用于方法级别和类级别。

在类上使用@SaCheckRole注解,表示该类下的所有方法都需要进行角色验证:

@RestController
@RequestMapping("/admin")
@SaCheckRole("admin") // 要求所有方法都需要admin角色
public class AdminController {

  /**
   * 新增用户
   */
  @PostMapping("/user")
  @SaCheckPermission("admin:add") // 新增用户需要 admin:add 权限
  public Map<String, Object> addUser(String username, String password) {
    // ...
  }

  /**
   * 获取用户列表
   */
  @GetMapping("/users")
  public Map<String, Object> getUsers() {
    // ...
  }
}

在上面的示例中,我们创建了一个/admin/user接口,只有拥有admin:add权限的用户才能调用该接口。同时,在AdminController类上使用@SaCheckRole注解,表示该类下的所有方法都需要拥有admin角色。

在方法上使用@SaCheckRole和@SaCheckPermission注解,可以单独控制特定方法的权限和角色:

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

  /**
   * 新增用户
   */
  @PostMapping("/add")
  @SaCheckPermission("user:add")
  public Map<String, Object> addUser(String username, String password) {
    // ...
  }

  /**
   * 获取用户列表
   */
  @GetMapping("/list")
  public Map<String, Object> getUsers() {
    // ...
  }
}

在上面的示例中,我们创建了一个/user/add接口,只有拥有user:add权限的用户且拥有admin角色的用户才能调用该接口。同时,在UserController类上使用@SaCheckRole注解,表示该类下的所有方法都需要拥有admin角色。

四、总结

Sa-Token是一款轻量级的Java权限验证框架,支持主流的Java框架,并提供了多种身份验证和角色权限验证的方式。在SpringBoot框架中,只需添加依赖、配置文件,以及编写相应的代码即可轻松地使用Sa-Token进行身份验证和角色权限验证。