进学阁

业精于勤荒于嬉,行成于思毁于随

0%

微服务中的SpringCloudGateway如何传递用户信息

我们在权限验证中提到了在网关中会通过缓存取出用户数据。当我们获取到用户信息后应该怎么传递下去,有两种方案:

一种是通过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中实现健权后如何将用户信息进行传递,通过拦截器以及网关传递轻松的实现了用户身份的传递