我们在权限验证中提到了在网关中会通过缓存取出用户数据。当我们获取到用户信息后应该怎么传递下去,有两种方案:
一种是通过redis对数据进行存储,在不同的服务中通过同一个redis进行调用。
第二种:在SpringCloudGateway中将数据取出后放入请求头,然后通过请求头进行传输
第一种方案的弊端很明显,需要多次的进行redis链接,增加了redis的负担,也增加了系统的不稳定性
所以我们这次的实现以第二种方法为主
代码实现:
网关处获取到用户信息,通过定义header头信息将用户信息进行传递
1 2 3 4 5 6 7 8
| String loginUserKey = String.format("%S%S", SecurityConstants.USER_KEY, token); if (distributedCache.hasKey(loginUserKey)) { LoginUser loginUser= distributedCache.get(loginUserKey, LoginUser.class); if (loginUser != null){ addHeader(mutate, SecurityConstants.USER_ID_HEADER, loginUser.getUserId(),false); addHeader(mutate, SecurityConstants.USER_NAME_HEADER, loginUser.getUserName(),false); } }
|
在服务中我们通过拦截器对请求进行拦截,通过拦截器来实现header头文件中的用户信息捕捉
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public class UserTokenHandlerInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String userId = request.getHeader(SecurityConstants.USER_ID_HEADER); String userName = request.getHeader(SecurityConstants.USER_NAME_HEADER); RequestHeaderContextHolder.getInstance().setCurrentUser(userId, userName); return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { RequestHeaderContextHolder.getInstance().clear(); }
}
|
在spring中注册拦截器
1 2 3 4 5 6 7
| public class WebMvcConfigurerAdaptor implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new UserTokenHandlerInterceptor()); } }
|
这样我们就可以在服务中获取到用户信息
小结:
本文主要讲的spingcloud gateway中实现健权后如何将用户信息进行传递,通过拦截器以及网关传递轻松的实现了用户身份的传递