Xtr*_*ica 5 spring-security spring-boot spring-cloud keycloak netflix-zuul
我正在使用Zuul反向代理实用程序配置Spring Cloud(Angel.SR6)应用程序,以便隐藏内部服务端口。我的zuul(edge)服务发布在8765端口中,而我的组织服务发布在8083端口中。当我在没有安全性的情况下访问应用程序时,一切都会顺利进行,并http://localhost:8765/organization/organizations返回所有组织的JSON。
但是,现在我想集成Keycloak SSO(OAuth2)服务器以进行授权。我已经在组织服务中添加了Spring Security适配器,并将其配置为在中进行身份验证http://localhost:8080/auth。一切正常,除了zuul执行重定向而不是代理。因此,当身份验证成功后,我将重定向到http://localhost:8083/organizations而不是http://localhost:8765/organization/organizations。这是我的浏览器请求:
这是因为keycloak适配器在中创建了令牌验证端点http://localhost:8083/sso/login,从该端点执行重定向到授权服务器以验证令牌。授权服务器确认后,会将重定向和/organization路径一起发送到组织服务,因此要加载的最终URL为http://localhost:8083/organizations。但我想改为加载第一个请求的URL。
我有哪个选择?
最近我也遇到了同样的问题。我已经解决了:
添加到 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();
}
Run Code Online (Sandbox Code Playgroud)
}
| 归档时间: |
|
| 查看次数: |
5094 次 |
| 最近记录: |