我正在使用 Zuul 反向代理实用程序配置 Spring Cloud (Angel.SR6) 应用程序,以隐藏内部服务端口。我的 zuul(边缘)服务发布在 8765 端口,我的组织服务发布在 8083 端口。当我在没有安全性的情况下访问应用程序时,一切都很顺利,http://localhost:8765/organization/organizations
返回包含所有组织的 JSON。
但是,现在我想集成 Keycloak SSO (OAuth2) 服务器以进行授权。我已经添加了Spring 安全适配器 https://keycloak.github.io/docs/userguide/keycloak-server/html/ch08.html#spring-security-adapter在我的组织服务中并将其配置为在中进行身份验证http://localhost:8080/auth
。一切都很顺利,除了 zuul 执行的是重定向而不是代理。因此,当身份验证成功时,我会被重定向到http://localhost:8083/organizations
代替http://localhost:8765/organization/organizations
。这是我的浏览器请求:
这是因为 keycloak 适配器在http://localhost:8083/sso/login
,它执行重定向到授权服务器以验证令牌。当授权服务器确认后,重定向将发送到组织服务,其中包含/organization
路径,因此加载的最终网址是http://localhost:8083/organizations
。但我希望加载第一个请求的网址。
我有什么选择?
最近我也遇到了同样的问题。我已经解决了:
-
添加到Zuul中的application.properties
zuul.sensitive-headers=Cookie,设置 Cookie
-
Zuul中引入KeycloakFilterRoute
class KeycloakFilterRoute extends ZuulFilter {
private static final String AUTHORIZATION_HEADER = "authorization";
@Override
public String filterType() {
return "route";
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
if (ctx.getRequest().getHeader(AUTHORIZATION_HEADER) == null) {
addKeycloakTokenToHeader(ctx);
}
return null;
}
private void addKeycloakTokenToHeader(RequestContext ctx) {
RefreshableKeycloakSecurityContext securityContext = getRefreshableKeycloakSecurityContext(ctx);
if (securityContext != null) {
ctx.addZuulRequestHeader(AUTHORIZATION_HEADER, buildBearerToken(securityContext));
}
}
private RefreshableKeycloakSecurityContext getRefreshableKeycloakSecurityContext(RequestContext ctx) {
if (ctx.getRequest().getUserPrincipal() instanceof KeycloakAuthenticationToken) {
KeycloakAuthenticationToken token = (KeycloakAuthenticationToken) ctx.getRequest().getUserPrincipal();
return (RefreshableKeycloakSecurityContext) token.getCredentials();
}
return null;
}
private String buildBearerToken(RefreshableKeycloakSecurityContext securityContext) {
return "Bearer " + securityContext.getTokenString();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)