当前位置:   article > 正文

Spring Security(7) jwt整合_springsecurity整合jwt

springsecurity整合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
  • 1

此字符串通过逗号分割是由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>


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
创建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());


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
解析读取token
        JwtParserBuilder jwtParserBuilder = Jwts.parserBuilder();
        //设置解析的签名算法
        jwtParserBuilder = jwtParserBuilder.setSigningKey(key);

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

        String signature = claimsJws.getSignature();
        System.out.println("<========>");
        Syste
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/546313
推荐阅读
相关标签
  

闽ICP备14008679号