关于JWT的内容,请看以下链接,主要看它的原理,以及缺点!
https://blog.csdn.net/memmsc/article/details/78122931
步骤1:前端传userName+password到后端,后端为springcloud架构,经过网关的拦截器拦截请求,拦截器在项目启动的时候@Component进行加载。
步骤2:如果是第一次登陆,放行,进入JWT的加密生成Token阶段(还可以写入登陆用户的其他信息放在JWTmap中,之后可以利用Token来获取该用户信息),加密token需要一个随机数作为加密字段,将token的失效时间设置为一天,并且放到reids里面,设置该redis里面的token过期时间为30分钟,最后将Token返回给前端。
步骤3:以后任何的请求都带Token到后端去请求。
步骤4:拦截到非登陆请求,进行解密,鉴权,如果鉴权通过,更新redis里面token字段的失效时间,如果还有5分钟失效,再设置还有30分钟,目的就是让密码的过期时间变的活跃。
大致就是以上的过程,核心代码主要在网关拦截器解密鉴权和登陆接口的加密两部分
0,controller层的将得到的token做保存redis和设置过期时间的操作
-
compactJws = authService.generateJwt(username, password, userBean);
-
//将token存在redis里
-
stringRedisTemplate.opsForValue().set("token", compactJws);
-
//设置redis里面的数据失效时间为半小时
-
stringRedisTemplate.expire("token",1800,TimeUnit.SECONDS);
1,登陆接口的加密:
-
package com.movitech.user.service.imp;
-
import com.movitech.commons.entity.UserBean;
-
import com.movitech.commons.utils.CommonConstants;
-
import com.movitech.user.service.AuthService;
-
import io.jsonwebtoken.Jwts;
-
import io.jsonwebtoken.SignatureAlgorithm;
-
import org.joda.time.DateTime;
-
import org.springframework.stereotype.Service;
-
import java.util.Base64;
-
import java.util.HashMap;
-
import java.util.Map;
-
/**
-
* 用户身份验证Service
-
*/
-
@Service(value = "authService")
-
public class AuthServiceImpl implements AuthService {
-
@Override
-
public String generateJwt(String userName, String userPassword, UserBean userBean) {
-
// Base64编码后的secretKey
-
byte[] secretKey = Base64.getEncoder().encode(CommonConstants.SECURITY_KEY.getBytes());
-
// 设置失效时间
-
DateTime expirationDate = new DateTime().plusDays(1);
-
//DateTime expirationDate = new DateTime().plusMinutes(30);
-
// Claims是需要保存到token中的信息,可以自定义,需要存什么就放什么,会保存到token的payload中
-
Map<String, Object> claims = new HashMap<>();
-
// 用户角色
-
claims.put("role", "user");
-
// 用户名
-
claims.put("userName", userName);
-
claims.put(CommonConstants.USER_ID, userBean.getId());
-
claims.put("uuid",UUID.randomUUID().toString());
-
String compactJws = Jwts.builder()
-
// 设置subject,一般是用户的唯一标识,比如用户对象的ID,用户名等,目前设置的是userCode
-
.setSubject(userName)
-
// 设置失效时间
-
.setExpiration(expirationDate.toDate())
-
.addClaims(claims)
-
// 加密算法是HS512,加密解密统一就可以
-
.signWith(SignatureAlgorithm.HS512, secretKey)
-
.compact();
-
return compactJws;
-
}
-
}
- 1
以上常量类和pojo此处省略。。。。
2,网关拦截器解密鉴权:
-
package com.movitech.gateway.filter;
-
import com.movitech.commons.dto.ErrorResponseMap;
-
import com.movitech.commons.enums.ErrorCode;
-
import com.movitech.commons.utils.CommonConstants;
-
import com.movitech.commons.utils.JsonUtil;
-
import com.movitech.commons.utils.ResponseUtil;
-
import com.netflix.zuul.ZuulFilter;
-
import com.netflix.zuul.context.RequestContext;
-
import io.jsonwebtoken.*;
-
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstant