我正在开发一个使用Spring Boot,Spring Cloud和Zuul作为网关的应用程序。
我使用Spring Security创建了一个授权服务,该服务将在用户登录时生成JWT令牌。
Zuul网关可以解码此令牌,并将请求发送到我的应用程序中,传递给路由服务。
现在的问题是,我如何才能在一种微服务中获取登录用户(或令牌本身)?有没有办法告诉Zuul网关将令牌附加到他传递给路由路径的每个请求上?
所有微服务都没有将Spring Security作为依赖项,因为这种想法是仅在网关级别而不是在所有地方都检查令牌,但是我找不到合适的方法...
假设我在网关中路由了一个用户服务。登录后,用户要检查其个人资料。
他将使用令牌向{{gateway_url}}/getUser
发出请求。
网关配置为
zuul:
ignored-services: '*'
sensitive-headers: Cookie,Set-Cookie
routes:
user-service:
path: /user/**
service-id: USER-SERVICE
网关会将此请求路由到USER-SERVICE应用程序和getProfile
控制器方法,我如何知道哪个是登录用户?谁提出了请求?
答案 0 :(得分:0)
敏感标头是黑名单,默认值不为空。因此,要使Zuul发送所有标头(被忽略的标头除外),必须将其显式设置为空列表。如果要将Cookie或授权标头传递到后端,则必须这样做。以下示例显示了如何使用sensitiveHeaders:
application.yml
:
zuul:
routes:
users:
path: /myusers/**
sensitiveHeaders:
url: https://downstream
答案 1 :(得分:0)
现在的问题是,我如何获得登录用户(或令牌) 本身)在微服务之一中?有没有办法告诉Zuul 将令牌附加到他传递给路由的每个请求的网关 路径?
您可以在zuul路由请求之前将任何自定义标头添加到请求中, 看一下这段代码:
@Configuration
public class ZuulCustomFilter extends ZuulFilter {
private static final String ZULL_HEADER_USER_ID = "X-Zuul-UserId";
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
return authentication != null && authentication.getPrincipal() != null;
}
@Override
public Object run() throws ZuulException {
if (
SecurityContextHolder.getContext().getAuthentication().getPrincipal() != null &&
SecurityContextHolder.getContext().getAuthentication().getPrincipal() instanceof OnlineUser
) {
OnlineUser onlineUser = (OnlineUser) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
RequestContext ctx = RequestContext.getCurrentContext();
ctx.addZuulRequestHeader(ZULL_HEADER_USER_ID, onlineUser.getId());
}
return null;
}
}
在此示例中,用户的ID附加到请求,然后将其路由到相应的服务。 此过程将在Spring Security执行用户授权后立即进行