sa-token的前后端分离中的简单使用

sa-token的前后端分离中的简单使用

sa-token: 一个轻量级 java 权限认证框架,让鉴权变得简单、优雅!极大程度上减少鉴权相关代码的编写,实现注入即用的效果。

官方文档 :https://sa-token.cc/

详细配置及其学习请在官方文档学习。

  1. 引入相关依赖
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot3-starter</artifactId>
    <version>1.34.0</version>
</dependency>
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-jwt</artifactId>
    <version>1.34.0</version>
</dependency>

本次引入的为springboot3中的使用,必须满足jdk>=17,springboot2以及jdk17以下的版本请根据官网中的相关说明进行配置

  1. 相关参数配置

    application.yml 文件中增加如下配置

    sa-token:
      tokenName: Authorization
      tokenPrefix: Bearer
      timeout: 86400
      activityTimeout: -1
      isConcurrent: true
      isShare: true
      tokenStyle: random-128
      isLog: false
      jwt-secret-key: zxcvbnmasdfghjklqwertyuiop
    

    具体参数参考如下文档

    参数名称 类型 默认值 说明
    tokenName String satoken Token 名称 (同时也是 Cookie 名称、数据持久化前缀)
    timeout long 2592000 Token 有效期,单位/秒 默认30天,-1代表永久有效
    activityTimeout long -1 Token 临时有效期 (指定时间内无操作就视为token过期) 单位: 秒, 默认-1 代表不限制 (例如可以设置为1800代表30分钟内无操作就过期)
    isConcurrent Boolean true 是否允许同一账号并发登录 (为 true 时允许一起登录,为 false 时新登录挤掉旧登录)
    isShare Boolean true 在多人登录同一账号时,是否共用一个token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)
    maxLoginCount int 12 同一账号最大登录数量,-1代表不限 (只有在 isConcurrent=true, isShare=false 时此配置才有效)
    isReadBody Boolean true 是否尝试从 请求体 里读取 Token
    isReadHeader Boolean true 是否尝试从 header 里读取 Token
    isReadCookie Boolean true 是否尝试从 cookie 里读取 Token,此值为 false 后,StpUtil.login(id) 登录时也不会再往前端注入Cookie
    isWriteHeader Boolean false 是否在登录后将 Token 写入到响应头
    tokenStyle String uuid token风格
    dataRefreshPeriod int 30 默认数据持久组件实现类中,每次清理过期数据间隔的时间 (单位: 秒) ,默认值30秒,设置为-1代表不启动定时清理
    tokenSessionCheckLogin Boolean true 获取 Token-Session 时是否必须登录 (如果配置为true,会在每次获取 Token-Session 时校验是否登录)
    autoRenew Boolean true 是否打开自动续签 (如果此值为true, 框架会在每次直接或间接调用 getLoginId() 时进行一次过期检查与续签操作)
    tokenPrefix String null token前缀,例如填写 Bearer 实际传参 satoken: Bearer xxxx-xxxx-xxxx-xxxx
    isPrint Boolean true 是否在初始化配置时打印版本字符画
    isLog Boolean false 是否打印操作日志
    jwtSecretKey String null jwt秘钥 (只有集成 sa-token-temp-jwt 模块时此参数才会生效)
    sameTokenTimeout long 86400 Same-Token的有效期 (单位: 秒)
    basic String "" Http Basic 认证的账号和密码
    currDomain String null 配置当前项目的网络访问地址
    checkSameToken Boolean false 是否校验Same-Token(部分rpc插件有效)
    cookie Object new SaCookieConfig() Cookie配置对象
  2. 登录接口处理
public R login(LoginVO loginVO) {
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(User::getUserName,loginVO.getUserName());
        queryWrapper.eq(User::getPassword,loginVO.getPassword());
        User user = userService.getOne(queryWrapper);
        if (Objects.nonNull(user)){
            StpUtil.login(user.getId(),
                    SaLoginConfig.setExtra("userId",user.getId())
                            .setExtra("userName",user.getUserName())
                            .setExtra("realName",user.getRealName())
            );
            SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
            Map<String,Object> result = new HashMap<>();
            result.put(CommonConstant.TOKEN_KEY,tokenInfo.getTokenValue());
            return R.data(result,"登录成功");
        }
        return R.fail(ResultCodeEnum.ACCOUNT_OR_PASSWORD_INCORRECT);
}
  1. 拦截过滤配置
@Configuration
public class SaTokenConfig implements WebMvcConfigurer {

    String[] writeUrl = new String[]{
            "/auth/login",
            "/doc.html",
            "/v3/api-docs/**",
            "/webjars/js/**",
            "/webjars/css/**",
            "/favicon.ico"
    };

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SaInterceptor(handler -> StpUtil.checkLogin()))
                .addPathPatterns("/**")
                .excludePathPatterns(writeUrl);
    }
}

jwt生成规则配置

@Configuration
public class SaTokenJwtConfig {

    @Bean
    public StpLogic getStpLogicJwt() {
        return new StpLogicJwtForStateless();
    }
}

配置完成,接下来就可以通过postman等工具进行测试了!!!

posted @ 2023-05-30 00:06  李东阳  阅读(1004)  评论(0编辑  收藏  举报