spring security jwt

JWT是一种开放标准,用于在各方间安全传输JSON对象。它由三部分组成:Header,Payload,Signature。Signature确保令牌完整性和防止篡改。文章中展示了JWT的创建和验证过程,以及如何在SpringSecurity中使用JWT进行身份验证。
摘要由CSDN通过智能技术生成

jwt定义
JSON Web Token(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且独立的方式,可以在各方之间作为JSON对象安全地传输信息。

组成
由三个部分组成,header.payload.signature
header:令牌头部,记录了整个令牌的类型和签名算法
payload:令牌负荷,记录了保存的主体信息,比如你要保存的用户信息就可以放到这里
signature:令牌签名,按照头部固定的签名算法对整个令牌进行签名,该签名的作用是:保证令牌不被伪造和篡改

过程
header:{“alg”:“HS256”,“typ”:“JWT”}
payload:{“username”: “alice”,“userId”: 1,“roleIds”: [1001,1002,1003]}
signature:还没生成

header:base64UrlEcode({“alg”:“HS256”,“typ”:“JWT”})
payload:base64UrlEcode({“username”: “alice”,“userId”: 1,“roleIds”: [1001,1002,1003]})
signature:HMACSHA256(base64UrlEcode({“alg”:“HS256”,“typ”:“JWT”})+“.”+base64UrlEcode({“username”: “alice”,“userId”: 1,“roleIds”: [1001,1002,1003]}),“secret key”)

header:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
payload:eyJyb2xlSWRzIjpbMTAwMSwxMDAyLDEwMDNdLCJ1c2VySWQiOjEsInVzZXJuYW1lIjoiYWxpY2UifQ
signature:tphGcSJcqM2zHhiq-Kx9rtamKX9A8G9jSNsBV-oR9dk

jwt=header.payload.signature

HMACSHA256=HMAC+SHA256
HMAC:Hash-based Message Authentication Code,散列消息认证码–一种带有密钥的哈希摘要算法
SHA256:哈希摘要算法

在线base64Url解码/编码网站:http://www.lzltool.com/base64url

核心类
org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter
org.springframework.security.jwt.JwtHelper

核心方法

//加密
public static Jwt encode(CharSequence content, Signer signer) {
        return encode(content, signer, Collections.emptyMap());
    }
    
//解密并验证签名
public static Jwt decodeAndVerify(String token, SignatureVerifier verifier) {
		//这一步就把token信息解密为明文的payload,所以payload的信息其实是在知道token后,就可以解析出,故里面不要放敏感信息如 密码等
        Jwt jwt = decode(token);
        //这一步就是验签,把解密后的payload信息用secret key加密,然后把结果和token的signature比较,相同代表验签通过(表明payload的信息没有被修改和secret key正确),不同就会抛出异常
        jwt.verifySignature(verifier);
        return jwt;
    }

示例

import com.alibaba.fastjson.JSONObject;
import org.springframework.security.jwt.Jwt;
import org.springframework.security.jwt.JwtHelper;
import org.springframework.security.jwt.crypto.sign.MacSigner;

import java.util.Arrays;

public class JWTDemo {

    public static void main(String[] args) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("username","alice");
        jsonObject.put("userId",1);
        jsonObject.put("roleIds", Arrays.asList(1001,1002,1003));
        String payloadInfo = jsonObject.toJSONString();

        //生成jwt
        String jwtToken = JwtHelper.encode(payloadInfo , new MacSigner("secret key")).getEncoded();
        System.out.println(jwtToken);

        //jwt解码和验签
        Jwt jwt = JwtHelper.decodeAndVerify(jwtToken , new MacSigner("secret key"));
        //claimsStr 就是 payloadInfo
        String claimsStr = jwt.getClaims();
        System.out.println(claimsStr);
    }
}

spring security集成了jwt,按需使用,有兴趣的可以追一下代码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值