java - 如何使用 Spring Boot 在 Keycloak 中设置 redirect_uri

标签 java spring spring-boot keycloak keycloak-services

我正在使用 Keycloak在我的 Spring Boot 应用程序中,但我不知道如何提供我自己的重定向 uri

这是我的配置

keycloak:
    use-resource-role-mappings: true
    realm: customer-realm
    resource: web-frontend
    token-minimum-time-to-live: 30
    principal-attribute: preferred_username
    credentials:
        secret: 321321321-88a2-424c-bb4c-2312312321
    auth-server-url: http://auth.customer.mydomain.tld:9080/auth

我试图设置 redirect_uri通过以下方式
   <a href="/login?redirect_uri=http://localhost:8443/customer/account">Login</a>

当然,我已将此 URI 添加到我的领域设置中。

但是当用户点击链接时,它看起来如下
http://auth.customer.mydomain.tld:9080/auth/realms/customer-realm/protocol/openid-connect/auth?response_type=code&client_id=web-frontend&redirect_uri=http%3A%2F%2Flocalhost%3A8443%2Fsso%2Flogin&state=e81ad405-8a83-4e84-a155-2f1275f4390b&login=true&scope=openid

如何提供自己的重定向 URI?

谢谢

最佳答案

我不知道这个问题是否仍然相关,但我偶然发现了同样的问题。尽管有可能通过配置 keycloak.redirect-rewrite-rules.pathOld=pathNew 重写部分 URI这不适用于权限,即域名。
但是redirect-uri 的域名取自Host请求的 header ,因此适当设置此 header 就足够了,例如在代理中。

或者,您需要注入(inject)一个自定义的 PostProcessor,它最终会注入(inject)一个子类 OAuthRequestAuthenticator被覆盖 getRequestUrl() .草图代码看起来像这样:

@Component
public class KeycloackAuthenticationProcessingFilterPostProcessor implements BeanPostProcessor {

    private static final Logger logger = LoggerFactory.getLogger(KeycloackAuthenticationProcessingFilterPostProcessor.class);

    private void process(KeycloakAuthenticationProcessingFilter filter) {
        filter.setRequestAuthenticatorFactory(new SpringSecurityRequestAuthenticatorFactory() {
            @Override
            public RequestAuthenticator createRequestAuthenticator(HttpFacade facade, HttpServletRequest request, KeycloakDeployment deployment, AdapterTokenStore tokenStore, int sslRedirectPort) {
                return new SpringSecurityRequestAuthenticator(facade, request, deployment, tokenStore, sslRedirectPort) {

                    @Override
                    protected OAuthRequestAuthenticator createOAuthAuthenticator() {
                        return new OAuthRequestAuthenticator(this, facade, deployment, sslRedirectPort, tokenStore) {

                            @Override
                            protected String getRequestUrl() {
                                return "http://localhost:8080";
                            }
                        };
                    }

                };
            }
        });
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof KeycloakAuthenticationProcessingFilter) {
            logger.info("Injecting Custom handler...");
            process(((KeycloakAuthenticationProcessingFilter) bean));
        }
        return bean;
    }
}

因为我有一个代理,所以我采取了简单的方法,只是调整了 Host相应的标题。

关于java - 如何使用 Spring Boot 在 Keycloak 中设置 redirect_uri,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54163924/

相关文章:

java - 在单词和引号之间分割字符串

java - jhipster/spring keycloak 集成 - 设置自定义 redirect_uri

java - 我的 Maven 构建中缺少 AbstractAnnotationConfigDispatcherServletInitializer

java - 无法解析的字符串 : [Unparseable date: "Wed May 29 16:34:58 ART 2013"] only on remote server

java - 在真实设备上调试 Android App 与 Servlet 的通信

java - 如何返回保证不会抛出 OnErrorNotImplementedException 的 RxJava Observable?

java - 如何使 Hibernate @Lock 注释适用于 Oracle DB?

java - 使用Spring云值时EmbeddedWebApplicationContext的ClassNotFoundException

spring - 覆盖 Maven 中的托管版本

java - Spring Boot - 在 Controller 方法之间保存用户