SpringCloud利用网关拦截做Token验证(JWT方式)

本文介绍了如何在SpringCloud架构中,利用网关拦截器进行JWT Token验证。首先,前端发送用户名和密码,网关拦截器在启动时加载。首次登录后,生成加密的Token并存储在Redis中,设置30分钟有效期。后续请求携带Token,拦截器解密鉴权,若Token有效则更新Redis中Token的过期时间。核心代码涉及网关拦截器的解密鉴权和登录接口的加密过程。
摘要由CSDN通过智能技术生成

关于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和设置过期时间的操作

  1. compactJws = authService.generateJwt(username, password, userBean);

  2. //将token存在redis里

  3. stringRedisTemplate.opsForValue().set("token", compactJws);

  4. //设置redis里面的数据失效时间为半小时

  5. stringRedisTemplate.expire("token",1800,TimeUnit.SECONDS);

 

 

1,登陆接口的加密:

 
  1. package com.movitech.user.service.imp;

  2.  
  3. import com.movitech.commons.entity.UserBean;

  4. import com.movitech.commons.utils.CommonConstants;

  5. import com.movitech.user.service.AuthService;

  6. import io.jsonwebtoken.Jwts;

  7. import io.jsonwebtoken.SignatureAlgorithm;

  8. import org.joda.time.DateTime;

  9. import org.springframework.stereotype.Service;

  10.  
  11. import java.util.Base64;

  12. import java.util.HashMap;

  13. import java.util.Map;

  14.  
  15. /**

  16. * 用户身份验证Service

  17. */

  18. @Service(value = "authService")

  19. public class AuthServiceImpl implements AuthService {

  20. @Override

  21. public String generateJwt(String userName, String userPassword, UserBean userBean) {

  22. // Base64编码后的secretKey

  23. byte[] secretKey = Base64.getEncoder().encode(CommonConstants.SECURITY_KEY.getBytes());

  24. // 设置失效时间

  25. DateTime expirationDate = new DateTime().plusDays(1);

  26. //DateTime expirationDate = new DateTime().plusMinutes(30);

  27. // Claims是需要保存到token中的信息,可以自定义,需要存什么就放什么,会保存到token的payload中

  28. Map<String, Object> claims = new HashMap<>();

  29. // 用户角色

  30. claims.put("role", "user");

  31. // 用户名

  32. claims.put("userName", userName);

  33. claims.put(CommonConstants.USER_ID, userBean.getId());

  34. claims.put("uuid",UUID.randomUUID().toString());

  35. String compactJws = Jwts.builder()

  36. // 设置subject,一般是用户的唯一标识,比如用户对象的ID,用户名等,目前设置的是userCode

  37. .setSubject(userName)

  38. // 设置失效时间

  39. .setExpiration(expirationDate.toDate())

  40. .addClaims(claims)

  41. // 加密算法是HS512,加密解密统一就可以

  42. .signWith(SignatureAlgorithm.HS512, secretKey)

  43. .compact();

  44. return compactJws;

  45. }

  46.  
  47. }

  • 1

以上常量类和pojo此处省略。。。。

2,网关拦截器解密鉴权:

 
  1. package com.movitech.gateway.filter;

  2.  
  3. import com.movitech.commons.dto.ErrorResponseMap;

  4. import com.movitech.commons.enums.ErrorCode;

  5. import com.movitech.commons.utils.CommonConstants;

  6. import com.movitech.commons.utils.JsonUtil;

  7. import com.movitech.commons.utils.ResponseUtil;

  8. import com.netflix.zuul.ZuulFilter;

  9. import com.netflix.zuul.context.RequestContext;

  10. import io.jsonwebtoken.*;

  11. import org.springframework.cloud.netflix.zuul.filters.support.FilterConstant

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值