Java 最简洁的登录验证方式:sa-token 整合 jwt

411 阅读2分钟

pom.xml

<properties>
    <sa.token.version>1.37.0</sa.token.version>
</properties>

<!-- Sa-Token 权限认证,在线文档:https://sa-token.cc -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot-starter</artifactId>
    <version>${sa.token.version}</version>
</dependency>
<!-- Sa-Token 整合 jwt -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-jwt</artifactId>
    <version>${sa.token.version}</version>
</dependency>

aplication-dev.yml

若需要其他配置可参考官网:sa-token.cc/doc.html#/s…

sa-token:
  jwt-secret-key: jZK1dtli8qcsp52zgp+UcylEDtjWSw2C2IzYq+h0A8qVn5hi2TQux0W3L4yzb/fAfFB28tGO+fq+L9zWVbw7pw==
  #  timeout: 28800
  active-timeout: -1

satoken 整合 jwt

项目的 /global/config 下整合 jwt

整合后生成的 token 才是jwt风格

import cn.dev33.satoken.jwt.StpLogicJwtForSimple;
import cn.dev33.satoken.stp.StpLogic;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SaTokenConfiguration {
    // Sa-Token 整合 jwt (Simple 简单模式)
    @Bean
    public StpLogic getStpLogicJwt() {
        return new StpLogicJwtForSimple();
    }
}

登录认证

@Override
public Map<String, String> login(String account, String password) {
    // 校验用户密码是否正确,可根据实际情况判断 
    if ("wang".equals(account) && "123456".equals(password)) {
        SaLoginModel loginUserInfo = getLoginUserInfo();
        // 第1步,先登录上。Token挂载的扩展参数 (此方法只有在集成jwt插件时才会生效)
        StpUtil.login(sysUser.getId(), loginUserInfo);
        // 第2步,获取 Token  相关参数 
        String token = StpUtil.getTokenValueByLoginId(sysUser.getId());
        System.out.println(token);
        // 3. 登录后设置 token session 信息
        StpUtil.getTokenSession().set("userInfo", loginUserInfo);
        // 4. 返回 token 信息
        Map<String, String> result = new HashMap<>();
        result.put("satoken", token);
        return result;
    }
    system.error.println("用户名或密码不正常");
    return null;
}


private SaLoginModel getLoginUserInfo() {
    SaLoginModel saLoginModel = new SaLoginModel();

    saLoginModel.setExtra("id", 1);
    saLoginModel.setExtra("name", "wangxxx");

    return saLoginModel;
}

其他方法

除了登录方法,我们可能还需要:

// 当前会话注销登录
StpUtil.logout();

// 获取当前会话是否已经登录,返回true=已登录,false=未登录
StpUtil.isLogin();

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

NotLoginException 异常场景

在会话未登录的情况下尝试获取loginId会使框架抛出NotLoginException异常,而同为未登录异常却有五种抛出场景的区分

场景值对应常量含义说明
-1NotLoginException.NOT_TOKEN未能从请求中读取到有效 token
-2NotLoginException.INVALID_TOKEN已读取到 token,但是 token 无效
-3NotLoginException.TOKEN_TIMEOUT已读取到 token,但是 token 已经过期 ()
-4NotLoginException.BE_REPLACED已读取到 token,但是 token 已被顶下线
-5NotLoginException.KICK_OUT已读取到 token,但是 token 已被踢下线
-6NotLoginException.TOKEN_FREEZE已读取到 token,但是 token 已被冻结
-7NotLoginException.NO_PREFIX未按照指定前缀提交 token