一、怎么基于Spring Security?
- 基于过滤器链中的
OncePerRequestFilter
每次请求识别请求头Header
中的token
二、token的识别步骤
- 获取请求头
String header = request.getHeader(HttpHeaders.AUTHORIZATION);
- 从
redis
中获取真的token
- 普通的
String操作 k-v
realToken = redisService.getCacheObject(token);
单点登录的重点就在于这个token与用户信息存在
redis
中,并且因为走的Spring Security
的过滤器链,使得分布式时,其他系统依赖到这个单独SSO
的系统上,其他请求也得走我们基于OncePerRequestFilter
的JwtVerifyFilter
三、RSA验证token
- 通过token、公钥,解析用户信息(验证token是否正确)
Payload<SysUser> payload = JwtUtils.getInfoFromToken(realToken, rsaKeyProperties.getPublicKey(),
SysUser.class);
- 解析
redis
中取出的realToken
/**
* 公钥解析token
*
* @param token 用户请求中的token
* @param publicKey 公钥
* @return Jws<Claims>
*/
private static Jws<Claims> parserToken(String token, PublicKey publicKey) {
return Jwts.parser().setSigningKey(publicKey).parseClaimsJws(token);
}
-
解析token后的
Jws<Claims>
后分为三部分(用户信息,token
,过期时间),JWT
一般都这样
-
后面的就比较常见了,重新设置Spring Security的全局认证,并
刷新token
【刷新过期时间Expire
】
-
既然有用来解析的,那就有生成的,就通过私钥加密
token
String token = JwtUtils.generateTokenExpireInMinutes(sysUser, rsaKeyProperties.getPrivateKey(), bodyId,
24 * 60);
- 加密关键参数与解析时除了
公钥
相同
RSA
生成的公钥与私钥
是一对,就可以用于上面的用处,至于具体的解析与加密方法先了解下JWT(jsonwebtoken
)【jar包jjwt-pai
】
四、完
到此结束
\(^o^)/~