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

2023-05-17 20:25:55 浏览数 (1)

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();

userControlleruserController

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

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

调用登陆接口 /user/login

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

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 "查询用户信息";
}

0 人点赞