Sa-Token简单几行代码,优雅的实现 SpringBoot 鉴权

发布时间 2023-07-27 18:26:51作者: 西红柿里没有番茄

一、添加依赖

二、设置配置文件

三、创建测试Controller:登录接口

四、创建测试Controller:普通访问接口

五、检验当前会话是否已经登录

六、路由拦截鉴权

七、自定义全局异常拦截

添加依赖

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

设置配置文件


server:
## 端口
port: 8081

## 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

创建测试Controller:登录接口

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

    // 测试登录,浏览器访问:http://localhost:8080/user/doLogin?username=abc&password=123456
    @RequestMapping("doLogin")
    public String doLogin(String username, String password) {
        // 此处仅作模拟示例,真实项目需要从数据库中查询数据进行比对
        if("abc".equals(username) && "123456".equals(password)) {
            StpUtil.login(10001);
            return "登录成功";
        }
        return "登录失败";
    }
    
}

创建测试Controller:普通访问接口

@RestController
@RequestMapping("/interview")
public class InterviewController {

    @RequestMapping("test1")
    public String test1(){
        // 校验当前客户端是否已经登录,如果未登录则抛出 `NotLoginException` 异常,后面加了路由拦截这个方法就用不上了,可以通过路由拦截
        StpUtil.checkLogin();

        return "访问接口test1";
    }

}

检验当前会话是否已经登录,这个方法可以在接口里单独使用

// 检验当前会话是否已经登录, 如果未登录,则抛出异常:`NotLoginException`
StpUtil.checkLogin();

路由拦截鉴权

@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
    // 注册拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册 Sa-Token 拦截器,校验规则为 StpUtil.checkLogin() 登录校验。
        registry.addInterceptor(new SaInterceptor(handle -> StpUtil.checkLogin()))
                .addPathPatterns("/**")
                .excludePathPatterns("/user/doLogin");
    }
}

自定义全局异常拦截

@RestControllerAdvice
public class GlobalExceptionHandler {
    // 全局异常拦截
    @ExceptionHandler
    public SaResult handlerException(Exception e) {
        e.printStackTrace();
        return SaResult.error(e.getMessage());
    }
}

image

以上流程全部走完,差不多就实现了登录的基本功能