Java轻量级权限认证框架Sa-Token的使用

作者:jayjay 时间:2023-03-13 16:34:59 

前言

相信大家都用过Spring Security和Shiro的框架,Spring Security必须配合Spring 全家桶使用和繁琐的配置,Shiro简单易学、轻便,但个人使用下来,觉得Sa-Token比Shiro更简单易学一点,基本是开箱即用。

Sa-Token 是什么?

Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证、权限认证、Session会话、单点登录、OAuth2.0、微服务网关鉴权 等一系列权限相关问题。

如何使用?

引入依赖

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

示例代码

登录接口就一行代码:StpUtil.login(id)

@RestController
@RequestMapping
public class LoginController {

    @GetMapping("doLogin")
    public ResultModel doLogin(String name, String pwd) {
        // 此处仅作模拟示例,真实项目需要从数据库中查询数据进行比对
        if("jayjay".equals(name) && "123456".equals(pwd)) {
            StpUtil.login(1001);
            return ResultModel.success("登录成功",StpUtil.getTokenInfo());
        }
        return ResultModel.error("登录失败");
    }

    @GetMapping("isLogin")
    public ResultModel isLogin() {
        return ResultModel.success("是否登录:"+StpUtil.isLogin(),StpUtil.getTokenInfo());
    }

    @GetMapping("logout")
    public ResultModel logout() {
        StpUtil.logout();
        return ResultModel.success("登出成功");
    }
}

我们登录一下:

Java轻量级权限认证框架Sa-Token的使用

登录成功,请求isLogin测试一下是否登录成功并获取当前登录用户

Java轻量级权限认证框架Sa-Token的使用

这样,我们就已经完成登录授权了,没错,在 Sa-Token 中,登录认证就是如此简单,不需要任何的复杂前置工作,只需这一行简单的API调用,就可以完成会话登录认证!

那么要怎么进行校验登录呢?只要在你需要校验登录处调用这个方法就行:

// 然后在需要校验登录处调用以下方法:
// 如果当前会话未登录,这句代码会抛出 `NotLoginException` 异常
StpUtil.checkLogin();

当然也可以使用注解或者 * ,这个后面再说

常用方法

在 Sa-Token 中,绝大多数功能都可以 一行代码 完成,在这里列举一下常用方法:

StpUtil.login(10001);    // 标记当前会话登录的账号id
StpUtil.getLoginId();    // 获取当前会话登录的账号id
StpUtil.isLogin();    // 获取当前会话是否已经登录, 返回true或false
StpUtil.logout();    // 当前会话注销登录
StpUtil.kickout(10001);    // 将账号为10001的会话踢下线
StpUtil.hasRole("super-admin");    // 查询当前账号是否含有指定角色标识, 返回true或false
StpUtil.hasPermission("user:add");    // 查询当前账号是否含有指定权限, 返回true或false
StpUtil.getSession();    // 获取当前账号id的Session
StpUtil.getSessionByLoginId(10001);    // 获取账号id为10001的Session
StpUtil.getTokenValueByLoginId(10001);    // 获取账号id为10001的token令牌值
StpUtil.login(10001, "PC");    // 指定设备标识登录,常用于“同端互斥登录”
StpUtil.kickout(10001, "PC");    // 指定账号指定设备标识踢下线 (不同端不受影响)
StpUtil.openSafe(120);    // 在当前会话开启二级认证,有效期为120秒
StpUtil.checkSafe();    // 校验当前会话是否处于二级认证有效期内,校验失败会抛出异常
StpUtil.switchTo(10044);    // 将当前会话身份临时切换为其它账号

常用注解

  • @SaCheckLogin: 登录认证 &mdash;&mdash; 只有登录之后才能进入该方法

  • @SaCheckRole("admin"): 角色认证 &mdash;&mdash; 必须具有指定角色标识才能进入该方法

  • @SaCheckPermission("user:add"): 权限认证 &mdash;&mdash; 必须具有指定权限才能进入该方法

  • @SaCheckSafe: 二级认证校验 &mdash;&mdash; 必须二级认证之后才能进入该方法

  • @SaCheckBasic: HttpBasic认证 &mdash;&mdash; 只有通过 Basic 认证后才能进入该方法

以上注解均可在官网看到用法,我就不一一列举了
不过,使用注解之前,还要把Sa-Token的 * 开起来,默认是关闭的

注册 *

以SpringBoot2.0为例, 新建配置类SaTokenConfigure.java

@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
   // 注册Sa-Token的注解 * ,打开注解式鉴权功能
   @Override
   public void addInterceptors(InterceptorRegistry registry) {
       // 注册注解 * ,并排除不需要注解鉴权的接口地址 (与登录 * 无关)
       registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");    
   }
}

保证此类被springboot启动类扫描到即可

Spring boot 集成

集成比较简单,只要添加依赖就行,Sa-Token在Spring Boot中是可以零配置启动的,上面的测试用例就是零配置启动的
当然也可以根据自己需要在配置

1、在application.yml配置

# Sa-Token配置
sa-token:
   # token名称 (同时也是cookie名称)
   token-name: satoken
   # token有效期,单位s 默认30天, -1代表永不过期
   timeout: 2592000
   # token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
   activity-timeout: -1
   # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
   is-concurrent: true
   # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
   is-share: false
   # token风格
   token-style: uuid
   # 是否输出操作日志
   is-log: false

2、通过代码配置

/**
 * Sa-Token代码方式进行配置
 */
@Configuration
public class SaTokenConfigure {

    // 获取配置Bean (以代码的方式配置Sa-Token, 此配置会覆盖yml中的配置)
    @Bean
    @Primary
    public SaTokenConfig getSaTokenConfigPrimary() {
        SaTokenConfig config = new SaTokenConfig();
        config.setTokenName("satoken");             // token名称 (同时也是cookie名称)
        config.setTimeout(30 * 24 * 60 * 60);       // token有效期,单位s 默认30天
        config.setActivityTimeout(-1);              // token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
        config.setIsConcurrent(true);               // 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) 
        config.setIsShare(true);                    // 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) 
        config.setTokenStyle("uuid");               // token风格 
        config.setIsLog(false);                     // 是否输出操作日志 
        return config;
    }

}

上面配置并非全部配置,所有配置可以在官网查看,根据自己的需要选择使用

来源:https://juejin.cn/post/7068105371839102983

标签:Java,Sa-Token
0
投稿

猜你喜欢

  • 使用Flutter实现一个走马灯布局的示例代码

    2023-06-19 03:50:03
  • Spring Boot JPA Repository之existsBy查询方法失效的解决

    2023-01-27 18:36:10
  • java中的GC收集器详情

    2021-11-22 16:59:34
  • Java、JavaScript、Oracle、MySQL中实现的MD5加密算法分享

    2022-08-24 02:42:11
  • Android应用开发中WebView的常用方法笔记整理

    2021-06-29 04:29:39
  • android panellistview 圆角实现代码

    2022-09-03 17:34:19
  • Springboot实现Shiro整合JWT的示例代码

    2022-01-30 02:58:32
  • 简单聊聊c# 事件

    2022-03-05 06:16:52
  • 在Ubuntu中安装VSCode并配置C/C++开发环境的方法步骤

    2021-07-04 18:19:19
  • Mybatis之association和collection用法

    2021-10-13 10:09:10
  • Android游戏开发学习②焰火绽放效果实现方法

    2023-10-26 08:54:53
  • WinForm导出文件为Word、Excel、文本文件的方法

    2022-07-08 20:07:16
  • C#实现windows form拷贝内容到剪贴板的方法

    2022-06-01 12:22:15
  • Springboot Thymeleaf模板文件调用Java类静态方法

    2023-11-25 05:34:47
  • java联调生成测试数据工具类方式

    2021-10-12 06:42:17
  • unity学习教程之定制脚本模板示例代码

    2022-02-18 05:07:08
  • Android录制声音文件(音频)并播放

    2023-07-04 06:31:19
  • Java数据结构之单链表详解

    2023-11-04 17:02:20
  • Struts2实现对action请求对象的拦截操作方法

    2023-06-08 01:54:13
  • MyBatis Generator 自定义生成注释的方法

    2023-02-24 12:37:23
  • asp之家 软件编程 m.aspxhome.com