首页 > 其他分享 >sa-token集成jwt

sa-token集成jwt

时间:2023-06-05 14:38:43浏览次数:26  
标签:return String jwt token tokenValue import sa public


向spring容器中加入一下类:用于重写:

<!-- https://mvnrepository.com/artifact/cn.dev33/sa-token-spring-boot-starter -->
        <dependency>
            <groupId>cn.dev33</groupId>
            <artifactId>sa-token-spring-boot-starter</artifactId>
            <version>1.19.0</version>
        </dependency>

        <!-- sa-token整合SpringAOP实现注解鉴权 -->
        <dependency>
            <groupId>cn.dev33</groupId>
            <artifactId>sa-token-spring-aop</artifactId>
            <version>1.19.0</version>
        </dependency>
<!-- JWT -->
        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>3.8.2</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.0</version>
        </dependency>
import java.util.Date;

import cn.dev33.satoken.SaManager;
import cn.dev33.satoken.config.SaTokenConfig;
import cn.dev33.satoken.context.model.SaStorage;
import cn.dev33.satoken.dao.SaTokenDao;
import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.SaTokenException;
import cn.dev33.satoken.session.SaSession;
import cn.dev33.satoken.stp.SaLoginModel;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpLogic;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaTokenConsts;
import io.jsonwebtoken.*;
import org.springframework.stereotype.Component;

/**
 * sa-token集成Jwt
 *
 * @author Lenovo
 */
@Component
public class SaTokenJwtUtil {

    /**
     * 秘钥 (随便手打几个字母就好了)
     */
    public static final String BASE64_SECURITY = "79e7c69681b8270162386e6daa53d1dd";

    /**
     * token有效期 (单位: 秒)
     */
    public static final long TIMEOUT = 60 * 60 * 2;


    public static final String LOGIN_ID_KEY = "loginId";


    /**
     * 根据userId生成token
     *
     * @param loginId 账号id
     * @return jwt-token
     */
    public static String createToken(Object loginId) {
        // 判断,不可使用默认秘钥
//    	if(BASE64_SECURITY.equals("79e7c69681b8270162386e6daa53d1dd")) {
//    		throw new SaTokenException("请更换秘钥");
//    	}
        // 在这里你可以使用官方提供的claim方法构建载荷,也可以使用setPayload自定义载荷,但是两者不可一起使用
        JwtBuilder builder = Jwts.builder()
                .setHeaderParam("type", "JWT")
                .claim(LOGIN_ID_KEY, loginId)
                .setIssuedAt(new Date())    // 签发日期
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * TIMEOUT))  // 有效截止日期
                .signWith(SignatureAlgorithm.HS256, BASE64_SECURITY.getBytes()); // 加密算法
        //生成JWT
        return builder.compact();
    }

    /**
     * 从一个jwt里面解析出Claims
     *
     * @param tokenValue token值
     * @return Claims对象
     */
    public static Claims getClaims(String tokenValue) {
//    	System.out.println(tokenValue);
        Claims claims = Jwts.parser()
                .setSigningKey(BASE64_SECURITY.getBytes())
                .parseClaimsJws(tokenValue).getBody();
        return claims;
    }

    /**
     * 从一个jwt里面解析loginId
     *
     * @param tokenValue token值
     * @return loginId
     */
    public static String getLoginId(String tokenValue) {
        try {
            Object loginId = getClaims(tokenValue).get(LOGIN_ID_KEY);
            if (loginId == null) {
                return null;
            }
            return String.valueOf(loginId);
        } catch (ExpiredJwtException e) {
//        	throw NotLoginException.newInstance(StpUtil.stpLogic.loginKey, NotLoginException.TOKEN_TIMEOUT);
            return NotLoginException.TOKEN_TIMEOUT;
        } catch (MalformedJwtException e) {
            throw NotLoginException.newInstance(StpUtil.stpLogic.loginKey, NotLoginException.INVALID_TOKEN);
        } catch (Exception e) {
            throw new SaTokenException(e);
        }
    }


    static {

        // 判断秘钥
        if (BASE64_SECURITY.equals("79e7c69681b8270162386e6daa53d1dd")) {
            String warn = "-------------------------------------\n";
            warn += "请更换JWT秘钥,不要使用示例默认秘钥\n";
            warn += "-------------------------------------";
            System.err.println(warn);
        }

        // 修改默认实现
        StpUtil.stpLogic = new StpLogic("login") {

            // 重写 (随机生成一个tokenValue)
            @Override
            public String createTokenValue(Object loginId) {
                return SaTokenJwtUtil.createToken(loginId);
            }

            // 重写 (在当前会话上登录id )
            @Override
            public void setLoginId(Object loginId, SaLoginModel loginModel) {
                // ------ 1、获取相应对象
                SaStorage storage = SaManager.getSaTokenContext().getStorage();
                SaTokenConfig config = getConfig();
                // ------ 2、生成一个token
                String tokenValue = createTokenValue(loginId);
                storage.set(splicingKeyJustCreatedSave(), tokenValue);    // 将token保存到本次request里
                if (config.getIsReadCookie() == true) {    // cookie注入
                    SaManager.getSaTokenContext().getResponse().addCookie(getTokenName(), tokenValue, "/", config.getCookieDomain(), (int) config.getTimeout());
                }
            }

            // 重写 (获取指定token对应的登录id)
            @Override
            public String getLoginIdNotHandle(String tokenValue) {
                try {
                    return SaTokenJwtUtil.getLoginId(tokenValue);
                } catch (Exception e) {
                    return null;
                }
            }

            // 重写 (当前会话注销登录)
            @Override
            public void logout() {
                // 如果连token都没有,那么无需执行任何操作
                String tokenValue = getTokenValue();
                if (tokenValue == null) {
                    return;
                }
                // 如果打开了cookie模式,把cookie清除掉
                if (getConfig().getIsReadCookie() == true) {
                    SaManager.getSaTokenContext().getResponse().deleteCookie(getTokenName());
                }
            }

            // 重写 (获取指定key的session)
            @Override
            public SaSession getSessionBySessionId(String sessionId, boolean isCreate) {
                throw new SaTokenException("jwt has not session");
            }

            // 重写 (获取当前登录者的token剩余有效时间 (单位: 秒))
            @Override
            public long getTokenTimeout() {
                // 如果没有token
                String tokenValue = getTokenValue();
                if (tokenValue == null) {
                    return SaTokenDao.NOT_VALUE_EXPIRE;
                }
                // 开始取值
                Claims claims = null;
                try {
                    claims = SaTokenJwtUtil.getClaims(tokenValue);
                } catch (Exception e) {
                    return SaTokenDao.NOT_VALUE_EXPIRE;
                }
                if (claims == null) {
                    return SaTokenDao.NOT_VALUE_EXPIRE;
                }
                Date expiration = claims.getExpiration();
                if (expiration == null) {
                    return SaTokenDao.NOT_VALUE_EXPIRE;
                }
                return (expiration.getTime() - System.currentTimeMillis()) / 1000;
            }

            // 重写 (返回当前token的登录设备)
            @Override
            public String getLoginDevice() {
                return SaTokenConsts.DEFAULT_LOGIN_DEVICE;
            }

            // 重写 (获取当前会话的token信息)
            @Override
            public SaTokenInfo getTokenInfo() {
                SaTokenInfo info = new SaTokenInfo();
                info.tokenName = getTokenName();
                info.tokenValue = getTokenValue();
                info.isLogin = isLogin();
                info.loginId = getLoginIdDefaultNull();
                info.loginKey = getLoginKey();
                info.tokenTimeout = getTokenTimeout();
//    			info.sessionTimeout = getSessionTimeout();
//    			info.tokenSessionTimeout = getTokenSessionTimeout();
//    			info.tokenActivityTimeout = getTokenActivityTimeout();
                info.loginDevice = getLoginDevice();
                return info;
            }

        };

    }
}

使用:

import com.alibaba.fastjson.JSON;
import com.example.mindsa.util.UserInfo;
import com.example.mindsa.util.result.AjaxJson;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import cn.dev33.satoken.stp.StpUtil;

@RestController
@RequestMapping("/test/")
public class TestJwtController {

    //登录
    @RequestMapping("login")
    public AjaxJson login(@RequestParam(defaultValue = "10001") String id) {
        UserInfo userInfo = new UserInfo();
        userInfo.setName("中国好声音");
        StpUtil.setLoginId(JSON.toJSONString(userInfo));
        String token = StpUtil.getTokenValue();
        return AjaxJson.getSuccess(token);
    }

    //使用-
    @RequestMapping("tokenInfo")
    public AjaxJson tokenInfo() {
        UserInfo userInfo = JSON.parseObject(StpUtil.getLoginId().toString(), UserInfo.class);
        return AjaxJson.getSuccessData(userInfo);
    }

    //使用-如何是第三方跳转登录,可以把token放到Cookie,也可以放到Head头里面
    @RequestMapping("tokenInfo2")
    public AjaxJson tokenInfo2(@RequestHeader String satoken) {
        UserInfo userInfo = JSON.parseObject(StpUtil.getLoginId().toString(), UserInfo.class);
        return AjaxJson.getSuccessData(userInfo);
    }
}
//手动解析token
public class ApplicationController extends BaseController {
    static String token = "eyJ0eXBlIjoiSldUIiwiYWxnIjoiSFMyNTYifQ.eyJsb2dpbklkIjoie1wiZW1haWxcIjpcIlwiLFwibmFtZVwiOm51bGwsXCJvcmdpZFwiOlwiMFwiLFwicGhvbmVcIjpcIlwiLFwidXNlcm5hbWVcIjpcInpoaWh1emhleWVcIn0iLCJpYXQiOjE2MzIyODEyMzAsImV4cCI6MTY2MzgxNzIzMH0.BL9bTTqeWviD4rPD7L_6tygz6Q78fJ7YBTY3yEPuLUA";
    public static void main(String[] args) {
        //手动生成token
        String mytoken = SaTokenJwtUtil.createToken("loginId");
        //手动解析token
        Claims claims = SaTokenJwtUtil.getClaims(token);
        System.out.println(claims);
    }

}

标签:return,String,jwt,token,tokenValue,import,sa,public
From: https://blog.51cto.com/u_14121041/6415400

相关文章

  • Jwt生成和解析工具类(万用版,可作为数据存储容器来传输)
    packagecom.ciih.authcenter.client.util.jwt;importcom.alibaba.fastjson.JSON;importcom.auth0.jwt.JWT;importcom.auth0.jwt.JWTCreator;importcom.auth0.jwt.JWTVerifier;importcom.auth0.jwt.algorithms.Algorithm;importcom.auth0.jwt.interfaces.Claim;......
  • [ABC205F] Grid and Tokens 题解
    GridandTokens题目大意给定\(n\)个点和一个\(H\timesW\)的网格,每个点可以放置在\((A_i,B_i)\)到\((C_i,D_i)\)的矩形中或不放,每一行或一列只能放置一个点,求最多能放多少个点。思路分析首先看数据范围,再结合题目给的限制条件,容易发现这是一道网络流。考虑建图,因为......
  • systemctl mask 和 systemctl disable
    https://blog.csdn.net/qq_44370158/article/details/118178165?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-118178165-blog-104569146.235%5Ev36%5Epc_relevant_default_base3&depth_1-utm_sou......
  • Linux系统下Samba服务器的配置
    第1步:将目录/home/media设置为允许所有用户访问,但仅允许用户mary具有修改该目录的权限。其配置步骤简述如下。第2步:将目录/var/samba/student设置为只允许student组的成员访问,student组中有stu01、stu02·····stu05,共5个成员。配置步骤简述如下。第3步:用testparm命令测试......
  • JWT入门学习
    jwt概述JSONWebtoken简称JWT,是用于对应程序上的用户进行身份验证的标记,也就是说,使用JWT的应用程序不再需要保存与其有关的用户cookie或者session数据。此特性便于可伸缩性,同时保证应用程序的安全。jwt内部结构jwt就是一个字符串,经过加密处理与校验处理的字符串,形式为:A.B.CA......
  • mybatis-plus 批量插入方法saveBatch 踩坑
    1、问题描述由于我在数据库的一张表设置了两个主键,所以创建的实体我想都加上@TableId注解但是这样在mybatis-plus中一个实体只能有一个@TableId注解标识的主键2、然后我在批量插入时就遇到了问题,我使用的saveBatch方法进行的批量插入,在插入时实体的两个id我都设置值了,但是......
  • P3087 [USACO13NOV]Farmer John has no Large Brown Cow S
    正解像是康托展开之类的?但是蒟蒻不会,所以用了一堆STL。对于每一列的字符串,按照字典序给它们编号。这样每一行的形容词串就变成了一堆数字。设共有\(s\)列,第\(i\)列共有\(b_i\)个不同的形容词,那么实际上每一行就是一个“第\(i\)位是\(b_i\)进制”的数。设第\(j\)行......
  • Satori指纹识别原理及dhcp分析
    Satori是被动识别中的一款独树一帜的软件,和ettercap等软件不同,它专门采用dhcp进行识别。本文通过对satori进行测试、读源码对其识别机制进行简单的分析,并在最后一部分对Satori开发者的paper进行了解读。解压后有如下几个文件其中,dhcp.xml和tcp.xml在下文会详细分析,p0f.fp,p0fa.fp是......
  • CentOS 7安装配置Samba
    [color=darkblue]surootyum-yinstallsambasamba-clientsamba-commongroupaddwwwuseradd-gwwwwwwpasswdwww->输入这个用户密码mkdir-p/home/www/datachown-Rwww:www/home/www/datachmod-R777/home/www/datacd/etc/sambacp/etc/samba/smb.conf/etc/s......
  • 如何创建或解压asar文件
     https://www.cnblogs.com/cutewrp/p/14723913.htmlnpminstall-gasar 注意!cd和路径之间要空格!!!然后输入如下命令:asarpack./app.asar过一会儿,你会发现,它给你弹出一个命令行。像这样:C:\Users\username\Desktop\code>这时,你再打开这个文件夹,你就会发现,多了一......