前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SpringBoot结合Sa-token实现权限认证(3)

SpringBoot结合Sa-token实现权限认证(3)

原创
作者头像
流年Felix
发布2023-05-17 20:25:55
1.4K0
发布2023-05-17 20:25:55
举报

1、Sa-token的文档还是很清晰的,直接按照文档来就可以了,首先在Springboot项目中添加依赖

代码语言:javascript
复制
<!-- Sa-Token 权限认证,在线文档:https://sa-token.cc -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot-starter</artifactId>
    <version>1.34.0</version>
</dependency>

2、然后配置sa-token相关的参数:

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

3、Sa-Token 提供了扩展接口可以把token和session信息存储在Redis中,这里就按照文档集成进来,引入依赖

代码语言:javascript
复制
<!-- Sa-Token 整合 Redis (使用 jackson 序列化方式) -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-dao-redis-jackson</artifactId>
    <version>1.34.0</version>
</dependency>
<!-- 提供Redis连接池 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
</dependency>

4、引入redis相关的依赖后,还需要配置一下redis相关的信息,如下:

代码语言:javascript
复制
 Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
# spring.redis.password=
# 连接超时时间
spring.redis.timeout=10s
# 连接池最大连接数
spring.redis.lettuce.pool.max-active=200
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.lettuce.pool.max-wait=-1ms
# 连接池中的最大空闲连接
spring.redis.lettuce.pool.max-idle=10
# 连接池中的最小空闲连接
spring.redis.lettuce.pool.min-idle=0

5、添加路由拦截鉴权:SaTokenConfigure,这里排除登陆请求(/user/login)

代码语言:javascript
复制
/**
 * @author felix
 */
@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        try {
            // 注册 Sa-Token 拦截器,校验规则为 StpUtil.checkLogin() 登录校验。
            registry.addInterceptor(new SaInterceptor(handle -> StpUtil.checkLogin()))
                    .addPathPatterns("/**")
                    .excludePathPatterns("/user/login");
        }catch (NotLoginException e){
        }

    }
}

6、添加一个全局的异常处理器:GlobalExceptionHandler

代码语言:javascript
复制
@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler
    public ResponseData handlerException(Exception e) {
        if (e instanceof NotLoginException) {
            Map<String,Object> data=new HashMap<>();
            ResponseData responseData = new ResponseData();
            data.put("code",401);
            data.put("message",e.getMessage());
            responseData.setData(data);
            return responseData;
        }
        return ResponseData.failure("服务器异常");
    }
}

7、sa-token鉴权用法,user/login接口如果判断登陆成功则调用StpUtil.login(Object id)实现登陆认证,user/isLogin接口是判断用户是否是登陆状态的,只需要StpUtil.isLogin()就可以判断用户是否登陆状态

代码语言:javascript
复制
// 会话登录:参数填写要登录的账号id,建议的数据类型:long | int | String, 不可以传入复杂类型,如:User、Admin 等等
StpUtil.login(Object id);    
// 当前会话注销登录
StpUtil.logout();
// 获取当前会话是否已经登录,返回true=已登录,false=未登录
StpUtil.isLogin();
// 检验当前会话是否已经登录, 如果未登录,则抛出异常:`NotLoginException`
StpUtil.checkLogin();

userController
userController

8、接口请求结果验证:未登陆状态请求:/user/isLogin

未登陆状态请求:/user/isLogin
未登陆状态请求:/user/isLogin

调用登陆接口 /user/login

调用登陆接口 /user/login
调用登陆接口 /user/login
登陆成功后redis存储session和token信息
登陆成功后redis存储session和token信息
token
token

9、注解鉴权的使用:

代码语言:javascript
复制
// 登录校验:只有登录之后才能进入该方法 
@SaCheckLogin                        
@RequestMapping("info")
public String info() {
    return "查询用户信息";
}


// 角色校验:必须具有指定角色才能进入该方法 
@SaCheckRole("admin")        
@RequestMapping("add")
public String add() {
    return "只有admin角色才能 添加用户";
}

// 权限校验:必须具有指定权限才能进入该方法 
@SaCheckPermission("user-add")        
@RequestMapping("add")
public String add() {
    return "用户增加";
}

// 二级认证校验:必须二级认证之后才能进入该方法 
@SaCheckSafe()        
@RequestMapping("add")
public String add() {
    return "用户增加";
}

// Http Basic 校验:只有通过 Basic 认证后才能进入该方法 
@SaCheckBasic(account = "sa:123456")
@RequestMapping("add")
public String add() {
    return "用户增加";
}

// 校验当前账号是否被封禁 comment 服务,如果已被封禁会抛出异常,无法进入方法 
@SaCheckDisable("comment")                
@RequestMapping("send")
public String send() {
    return "查询用户信息";
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、Sa-token的文档还是很清晰的,直接按照文档来就可以了,首先在Springboot项目中添加依赖
  • 2、然后配置sa-token相关的参数:
  • 3、Sa-Token 提供了扩展接口可以把token和session信息存储在Redis中,这里就按照文档集成进来,引入依赖
  • 4、引入redis相关的依赖后,还需要配置一下redis相关的信息,如下:
  • 5、添加路由拦截鉴权:SaTokenConfigure,这里排除登陆请求(/user/login)
  • 6、添加一个全局的异常处理器:GlobalExceptionHandler
  • 7、sa-token鉴权用法,user/login接口如果判断登陆成功则调用StpUtil.login(Object id)实现登陆认证,user/isLogin接口是判断用户是否是登陆状态的,只需要StpUtil.isLogin()就可以判断用户是否登陆状态
  • 8、接口请求结果验证:未登陆状态请求:/user/isLogin
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档