用户身份认证-JWT

用户身份认证

1.单一服务器模式

image-20210917164630346

一般过程如下:
1.用户向服务器发送用户名和密码。
2.验证服务器后,相关数据(如用户名,用户角色等)将保存在当前会话(session) 中。
3.服务器向用户返回session, id, session信息都会写入到用户的C ookie.
4.用户的每个后续请求都将通过在Cookie中取出session. id传给服务器。
5.服务器收到session, id并对比之前保存的数据,确认用户的身份。
缺点:
●单点性能压力,无法扩展。
●分布式架构中,需要session共享方案,session共享方案存在性能瓶颈。

  1. cas 和oauth2

image-20210917165854027

一般过程如下:

  1. 当业务A、业务B需要登录时,将跳到SSO系统。
  2. SSO从用户信息数据库中获取用户信息并校验用户信息,SSO系统完成登录。
  3. 然后将用户信息存入缓存(例如redis)。
  4. 当用户访问业务A或业务B,需要判断用户是否登录时,将跳转到SSO系统中进行用户身份验证,SSO判断缓存中是否存在用户身份信息。
  5. 这样,只要其中一个系统完成登录,其他的应用系统也就随之登录了。这就是单点登录(SSO)的定义。

优点 :

用户身份信息独立管理,更好的分布式管理。可以自己扩展安全策略

缺点:

认证服务器访问压力较大。

3.token

image-20210917174830336

优点:

  • 无状态: token是无状态,session是有状态的
  • 基于标准化:你的API可以采用标准化的 JSON Web Token (JWT)

缺点:

  • 占用带宽
  • 无法在服务器端销毁

访问令牌

令牌类型

image-20210917175021389

思路

image-20210917175300215

JWT使用

导入依赖

创建普通maven项目,导入依赖

<dependencies>
    <!-- JWT -->
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.7.0</version>
    </dependency>

    <!--junit-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>

</dependencies>

了解jwt组成

image-20210918103745087

创建测试

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.junit.Test;

import java.util.Date;
import java.util.UUID;

public class JwtTests {
    private static long tokenExpiration=1000*60*60;
    private static String  tokenSignKey="laobinggan";

    @Test
    public void testCreateToken(){
       String jwt= Jwts.builder()
                //设置头
                .setHeaderParam("alg","HS256")
                .setHeaderParam("typ","JWT")

                //设置载荷默认数据数据
                .setSubject("test")
                .setIssuer("laobingan")
                .setAudience("me")
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis()+tokenExpiration))
                .setNotBefore(new Date(System.currentTimeMillis()+1000*20))
                .setId(UUID.randomUUID().toString())

                //设置载荷自定义数据
                .claim("name","lily")
				//设置签名
                .signWith(SignatureAlgorithm.HS256,tokenSignKey)
                //组装
                .compact();
        System.out.println(jwt);
    }
}

输出

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ0ZXN0IiwiaXNzIjoibGFvYmluZ2FuIiwiYXVkIjoibWUiLCJpYXQiOjE2MzE5MzMzMDIsImV4cCI6MTYzMTkzNjkwMiwibmJmIjoxNjMxOTMzMzAzLCJqdGkiOiI2NmY4YWY2Yy0zYWQ0LTRiYTAtODg5My1iZDU3NDNlYmFjNjMiLCJuYW1lIjoibGlseSJ9.f57O1aHH6kYF7Zxx80CTKCZ89VietD-P7s9K9fRB6xs

解析

  @Test
    public void parentJWT(){
        String jwt ="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ0ZXN0IiwiaXNzIjoibGFvYmluZ2FuIiwiYXVkIjoibWUiLCJpYXQiOjE2MzE5MzMzMDIsImV4cCI6MTYzMTkzNjkwMiwibmJmIjoxNjMxOTMzMzAzLCJqdGkiOiI2NmY4YWY2Yy0zYWQ0LTRiYTAtODg5My1iZDU3NDNlYmFjNjMiLCJuYW1lIjoibGlseSJ9.f57O1aHH6kYF7Zxx80CTKCZ89VietD-P7s9K9fRB6xs";
        JwtParser parser = Jwts.parser();
        Jws<Claims> claimsJws = parser.setSigningKey(tokenSignKey).parseClaimsJws(jwt);
        Claims body = claimsJws.getBody();
        String name = (String) body.get("name");
        System.out.println(name);

    }

输入

lily
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值