一.什么事单点登录?
答:单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。
二.单点登录三种常见方式:
1.session广播机制实现:即session复制
2.使用cookie+redis实现:
(1)在项目中任何一个模块进行登录,登录之后,把用户数据放到两个redis和cookie两个地方:
1>redis:在key :生成唯一随机值(ip,用户id等),value:用户数据
2>把redis里面生成的key值放到cookie里面。
(2)访问项目其他模块,发送请求带着cookie进行发送,获取cookie,拿着cookie值进行做事情:
1>获取到cookie值,到redis中进行查询,根据key值进行查询,如果查到用户数据就是登录。
3.使用token实现
token:按照一定的规则生成字符串,字符串可以包含用户信息(Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码)。
实现方式:
(1)在项目的某个模块进行登录,登录之后,按照一定的规则生成字符串,将用户数据放到字符串中,将字符串进行返回:
1>可以通过cookie进行返回
2>可以通过地址栏进行返回
(2)再访问项目中的其他模块,每次访问都在地址栏带着生成的字符串,在访问模块里面获取地址栏字符串,根据字符串获取用户信息,如果可以获取到,就是登录。
三.JWT是什么?
JWT:Json Web Token,是基于Json的一个公开规范,这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息,他的两大使用场景是:认证和数据交换
使用起来就是,由服务端根据规范生成一个令牌(token),并且发放给客户端。此时客户端请求服务端的时候就可以携带者令牌,以令牌来证明自己的身份信息。
简单来说,JWT就是已经定好了规则,可以使用JWT生成字符串,可以包含用户信息。
四.JWT的规则
eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOjYyNywiZXhwIjoxNTcwMDE0ODg1fQ.vPbQh4syxNCzkKXKPSM93LzzLqoJdzPDNeKz8tz9cFM4NzhIOdPrJcH2DG
-9-9MCUufCgrAhhGjuo85GKV4bOQ
1.JWT的头信息:
{'typ': 'JWT','alg': 'HS256'}
2.有效载荷:主体部分(包含用户信息)
3.签名哈希:防伪标志
五.JWT的使用
1.引入JWT依赖
io.jsonwebtoken
jjwt
2.编写JWT工具类
packagecom.atguigu.commonutils;importio.jsonwebtoken.Claims;importio.jsonwebtoken.Jws;importio.jsonwebtoken.Jwts;importio.jsonwebtoken.SignatureAlgorithm;importorg.springframework.http.server.reactive.ServerHttpRequest;importorg.springframework.util.StringUtils;importjavax.servlet.http.HttpServletRequest;importjava.util.Date;/***@authorhelen
*@since2019/10/16*/
public classJwtUtils {//定义两个常量//token的过期时间
public static final long EXPIRE = 1000 * 60 * 60 * 24;//秘钥
public static final String APP_SECRET = "ukc8BDbRigUDaY6pZFfWus2jZWLPHO";/*生成token字符串的方法*/
public staticString getJwtToken(String id, String nickname){
String JwtToken=Jwts.builder()//设置token的头信息
.setHeaderParam("typ", "JWT")
.setHeaderParam("alg", "HS256")//分类
.setSubject("guli-user")//设置token的过期时间
.setIssuedAt(newDate())
.setExpiration(new Date(System.currentTimeMillis() +EXPIRE))//设置token的主体信息,存储用户信息
.claim("id", id)
.claim("nickname", nickname)//设置签名哈希
.signWith(SignatureAlgorithm.HS256, APP_SEC