JWT和单点登录

JWT

什么是JWT

json web token令牌
在这里插入图片描述

JWT能做什么

在这里插入图片描述

为什么是JWT

基于传统的session认证

认证方式

在这里插入图片描述

认证流程

在这里插入图片描述

暴露问题

在这里插入图片描述

基于JWT认证

认证流程

在这里插入图片描述在这里插入图片描述

注意问题

在这里插入图片描述
在这里插入图片描述

JWT的结构

令牌组成

在这里插入图片描述

Header

在这里插入图片描述

Payload

在这里插入图片描述

Signature

在这里插入图片描述

组成

在这里插入图片描述

使用JWT

引入依赖

在这里插入图片描述

生成token

在这里插入图片描述

根据令牌和签名解析数据

在这里插入图片描述

JWT工具类封装

public class JwtUtils {

private static final  String SIGN="fjs#%^*jfskl";

/**
 * 生成jwtToken header.payload.sign
 * @param map
 * @return
 */
public static String creatJwtToken(Map<String,String> map){
    Calendar calendar=Calendar.getInstance();
    calendar.add(Calendar.DATE,7);//默认7天过期
    //创建jwt builder
    JWTCreator.Builder builder = JWT.create();
    //payload
    map.forEach((k,v)->{
        builder.withClaim(k,v);
    });
    String jwtToken = builder.withExpiresAt(calendar.getTime()) //过期时间
            .sign(Algorithm.HMAC256(SIGN));  //sign
    return jwtToken;
}

/**
 * 验证token
 * @param token
 */
public static void verifyToken(String token){
     JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);
}

/**
 * 获取token信息
 * @param token
 * @return
 */
public static DecodedJWT getTokenInfo(String token){
    DecodedJWT verify = JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);
    return verify;
}

}

整合springboot

思路

前端携带用户名密码来认证,认证通过返回token,后续用户请求其他接口带token来验证,验证通过可以访问其他接口,否则不能访问
@Mpper注解相当于启动类上的@MapperScanner注解

登录生成token

在这里插入图片描述

前端访问时令牌验证

在这里插入图片描述

存在的问题

在这里插入图片描述

拦截器优化

token 建议放在请求头里,所以要从请求头里获取

拦截器实现

在这里插入

拦截器配置

在这里插入图片描述

业务处理

在这里插入图片描述
JWT基于客户端的管理,只要客户端的不过期,就一直可用

单点登录

在这里插入图片描述

不同的域名代表不同的站点,域名不一样,部署的服务器(tomcat)不一样
三方登录
在这里插入图片描述

session跨域

什么是域

在这里插入图片描述

跨域

在这里插入图片描述

session跨域定义

在这里插入图片描述

单点登录实现机制

用JwtToken机制来实现单点登录和解决跨域问题。

单点登录踢人

实现单个账号只允许在一处登录的功能,也就是说在登录状态未失效的情况下,下一次登录必须踢掉上一次的登录。如果我们不做限制的话,单个账号多次登录就会产生多个token,只要未过期就都能调用接口。

使用redis

我们可以将用户每次登录后产生的token 存入redis 中,key中加入用户id来识别

//token 存入redis
redisTemplate.opsForValue().set("access_token:member_"+member.getId(), token, 30, TimeUnit.DAYS);

那么第二次同一账号执行登录操作的时候就会覆盖上一次登录存在redis中的token。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值