gpt4 book ai didi

spring - Keycloak Spring 安全客户端凭据授予

转载 作者:行者123 更新时间:2023-12-03 13:46:10 24 4
gpt4 key购买 nike

我可以用 KeycloakRestTemplate其中一个 keycloak 客户端正在与另一个 keycloak 客户端通信。但是,它仅在我登录到第一个 keycloak 客户端时才有效,即将客户端 ID、客户端密码、用户名、密码发送到 keycloak 服务器。如果我没有在第一个客户端上使用用户和密码进行身份验证,我会收到“无法设置授权 header ,因为没有经过身份验证的原则”。但是我已经将 keycloak 配置为对第一个客户端使用服务帐户(客户端凭据授予),因此我不应该使用用户/密码,而应该只依赖客户端 ID/ secret 。这是 OAuth 2 规范的错误/偏差吗?

最佳答案

KeycloakRestTemplate将客户端 ID、客户端密码、用户名和密码发送到 Keycloak 服务器。我只想发送客户端 ID 和密码。我创建了一个 KeycloakClientCredentialsRestTemplate OAuth2RestTemplate的子类去做这个。它使用 Spring Boot 中的 OAuth2 支持来授予客户端凭据。它还从 application.properties 获取 Keycloak 属性.

import org.springframework.security.oauth2.client.OAuth2ClientContext;
import org.springframework.security.oauth2.client.OAuth2RestTemplate;
import org.springframework.security.oauth2.client.resource.OAuth2ProtectedResourceDetails;

public class KeycloakClientCredentialsRestTemplate extends OAuth2RestTemplate {

public KeycloakClientCredentialsRestTemplate(OAuth2ProtectedResourceDetails resource,
OAuth2ClientContext context) {
super(resource, context);
}

}

还:
import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.security.oauth2.client.DefaultOAuth2ClientContext;
import org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsResourceDetails;
import org.springframework.security.oauth2.common.AuthenticationScheme;
import org.springframework.stereotype.Service;

@Service
public class KeycloakClientCredentialsConfig {

@Value("${keycloak.realm}")
private String realm;

@Value("${keycloak.auth-server-url}")
private String authServerUrl;

@Value("${keycloak.resource}")
private String clientId;

@Value("${keycloak.credentials.secret}")
private String clientSecret;

@Bean
public KeycloakClientCredentialsRestTemplate createRestTemplate() {
return new KeycloakClientCredentialsRestTemplate(getClientCredentialsResourceDetails(),
new DefaultOAuth2ClientContext());
}

private ClientCredentialsResourceDetails getClientCredentialsResourceDetails() {
String accessTokenUri = String.format("%s/realms/%s/protocol/openid-connect/token",
authServerUrl, realm);
List<String> scopes = new ArrayList<String>(0); // TODO introduce scopes

ClientCredentialsResourceDetails clientCredentialsResourceDetails =
new ClientCredentialsResourceDetails();

clientCredentialsResourceDetails.setAccessTokenUri(accessTokenUri);
clientCredentialsResourceDetails.setAuthenticationScheme(AuthenticationScheme.header);
clientCredentialsResourceDetails.setClientId(clientId);
clientCredentialsResourceDetails.setClientSecret(clientSecret);
clientCredentialsResourceDetails.setScope(scopes);

return clientCredentialsResourceDetails;
}

}

关于spring - Keycloak Spring 安全客户端凭据授予,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46073485/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com