Spring Security(7) jwt整合

jwt

基本介绍

jwt 全称是jsonWebToken, 简单的说就是一种能够携带信息的token。
在传统的web环境中,浏览器和后端通过记录在浏览器的cookie 和存储在服务端的session 来实现登录状态,而cookie session的方式在多分布式环境下可能带来session复制,跨域访问,单点登录等问题;
直接使用后端生成token的方式,服务端也需要存储生成的token信息,因为token是无意义的。而使用jwt ,能够携带一些必要得信息比如用户id 和用户名称等;
后端就不需要对生成的token做存储,同时jwt也有时间的有效期。能够做到请求接口无状态;

缺点:

  1. 安全性,payload是使用base64编码的,并没有加密,因此jwt中不能存储敏感数据。而session的信息是存在服务端的,相对来说更安全。
  2. 无法废弃,只能等待过期失效,或增加其他的黑名单类似的逻辑处理失效。

jwt 官网: https://jwt.io/

格式

在使用过程中是一个base64编码的字符串

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

此字符串通过逗号分割是由3部分组成

第一部分是 header 区域,只要表示当前签名的加密方式;
第二部分是 plaoyload 区域,存储了当前的token携带的信息,包含颁发给谁,有效期等
第三部分是 将前2部分通过加密生成的,主要用于服务端校验token的合法性;

使用

基本依赖

引用对应的依赖,关于jwt的工具类有很多,这里使用 https://github.com/jwtk/jjwt

引入maven依赖

<!--api->
 <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-api</artifactId>
            <version>0.11.2</version>
	</dependency>
<!---实现-->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt-impl</artifactId>
    <version>0.11.2</version>
    <scope>runtime</scope>
</dependency>


创建token使用
		//设置自定义header 信息
        JwtBuilder jwtBuilder = Jwts.builder().setHeaderParam("a", "b");

        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.MINUTE,30);

        Date expire = instance.getTime();

        //设置playload信息
        jwtBuilder = jwtBuilder.setIssuer("me")  //谁颁发的
                .setSubject("Bob")    // token的主体是什么 ,是关于什么的
                .setAudience("you")   // 给谁的
                .setExpiration(expire) //失效时间
                .setNotBefore(new Date()) //不能在此时间之前获取
                .setIssuedAt(new Date()) //签发时间
                .setId(UUID.randomUUID().toString());//id

        //设置自定义的playload信息
        jwtBuilder.claim("key","value");

        //构建签名算法,更多签名算法查看 SignatureAlgorithm
        Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
        jwtBuilder = jwtBuilder.signWith(key);

          //执行压缩 使生成的字符串变小
        jwtBuilder = jwtBuilder.compressWith(CompressionCodecs.DEFLATE);

        System.out.println(jwtBuilder.compact());


解析读取token
        JwtParserBuilder jwtParserBuilder = Jwts.parserBuilder();
        //设置解析的签名算法
        jwtParserBuilder = jwtParserBuilder.setSigningKey(key);

        Jws<Claims> claimsJws = jwtParserBuilder.build().parseClaimsJws(jwtStr);

        String signature = claimsJws.getSignature();
        System.out.println("<========>");
        Syste
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值