gpt4 book ai didi

java - Spring 应用程序对 keycloak 的基本身份验证

转载 作者:行者123 更新时间:2023-12-04 13:59:48 25 4
gpt4 key购买 nike

我需要将身份验证添加到我的 Spring Boot (MVC) 应用程序中。身份验证提供程序是通过 OpenID 的 key 斗篷。隐式和授权代码授权都被禁用,所以我坚持使用资源所有者凭据授权。我想要实现的是对未经授权用户的基本身份验证提示。以这种方式检索的凭据应该用于从 keycloak 获取 token 和用户信息,以供 Spring Security 进一步使用。应在每个请求上检查 token 。

我发现的大多数例子都使用了 org.keycloak:keycloak-spring-boot-starter 的重定向功能。 .虽然我找到了 enable-basic-auth here ,这对我不起作用。我知道我必须使用 keycloak.bearer-only=true关闭重定向,但它可以正常工作,而不是重定向,它为未经授权的用户返回 401。

我的安全配置:

@Configuration
@EnableWebSecurity
@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {

@Bean
public KeycloakSpringBootConfigResolver KeycloakConfigResolver() {
return new KeycloakSpringBootConfigResolver();
}

@Override
protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
}

@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().permitAll();
}
}

我的 keycloak 属性(我不使用占位符,这只是为了安全起见):
keycloak.auth-server-url=https://${keycloak.host}/auth/
keycloak.realm=master
keycloak.resource=${client.name}
keycloak.enable-basic-auth=true
keycloak.credentials.secret=${client.secret}

对不起,一般问题。我主要使用 jdbcAuthentication,这是我第一次使用身份管理软件。

最佳答案

这是通过具有资源所有者密码凭据流的 keycloak openid 向您的应用程序添加基本身份验证的一种方法。

首先,您需要将其添加到 pom.xml 中:

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.keycloak.bom</groupId>
<artifactId>keycloak-adapter-bom</artifactId>
<version>4.2.0.Final</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

...

<dependencies>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-spring-boot-starter</artifactId>
</dependency>
...
</dependencies>

添加 key 斗篷服务器属性:
keycloak.auth-server-url=https://${keycloak.host}/auth/
keycloak.realm=master
keycloak.resource=${client.name}
keycloak.credentials.secret=${client.secret}
keycloak.enable-basic-auth=true
keycloak.bearer-only=true
enable-basic-auth实际上负责启用资源所有者密码凭据流。因此,每次您发送带有基本授权的请求时 BasicAuthRequestAuthenticator将从 keycloak 请求 token 。 bearer-only需要关闭访问代码流。每次您在没有基本授权的情况下(和外部授权 session )向安全资源发出请求时,您都会被重定向到 keycloak 服务器 - 我们不希望那样。与 bearer-only你会得到 401。

最后一步是添加安全配置:
@Configuration
@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
@EnableWebSecurity
public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {

@Bean
public KeycloakAuthenticationProvider authenticationProvider() {
KeycloakAuthenticationProvider provider = new KeycloakAuthenticationProvider();
provider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());
return provider;
}

@Bean
public KeycloakSpringBootConfigResolver KeycloakConfigResolver() {
return new KeycloakSpringBootConfigResolver();
}

@Override
protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
}

@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http
.csrf().disable()
.exceptionHandling().authenticationEntryPoint((request, response, authException) -> {
response.addHeader(HttpHeaders.WWW_AUTHENTICATE, "Basic realm=\"Restricted Content\"");
response.sendError(HttpStatus.UNAUTHORIZED.value(), HttpStatus.UNAUTHORIZED.getReasonPhrase());
})
.and()
.authorizeRequests()
.antMatchers("/admin/**").hasRole("admin")
.anyRequest().permitAll();
}
}

这里最有趣的部分是:
        .exceptionHandling().authenticationEntryPoint((request, response, authException) -> {
response.addHeader(HttpHeaders.WWW_AUTHENTICATE, "Basic realm=\"Restricted Content\"");
response.sendError(HttpStatus.UNAUTHORIZED.value(), HttpStatus.UNAUTHORIZED.getReasonPhrase());
})

标准 key 披 AuthenticationEntryPoint实现正在设置 WWW-Authenticate标题到 String.format("Bearer realm=\"%s\"", realm)在授权失败的情况下。我需要将它设置为 Basic realm="Restricted Content"弹出基本身份验证提示。如果您想避免使用此提示(您想添加自己的登录表单)- 删除此部分。

关于java - Spring 应用程序对 keycloak 的基本身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51725873/

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