OAuth 2 Spring Authz 服务器(
spring-boot-starter-oauth2-authorization-server
)的最小配置工作正常:
@Configuration
public class SecurityConfig {
@Bean
@Order(1)
public SecurityFilterChain authServer(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);
http.getConfigurer(OAuth2AuthorizationServerConfigurer.class).oidc(Customizer.withDefaults());
http.exceptionHandling((e) -> e.authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login")));
return http.build();
}
@Bean
@Order(2)
public SecurityFilterChain defaultChain(HttpSecurity http) throws Exception {
return http.authorizeHttpRequests((authorize) -> authorize.anyRequest().authenticated())
.formLogin(Customizer.withDefaults())
.build();
}
}
此将未经身份验证的用户重定向到 Spring 的默认登录表单。然而,我想使用 HTTP 基本身份验证来打开浏览器的本机弹出窗口。这是我尝试过的:
@Configuration
public class SecurityConfig {
@Bean
@Order(1)
public SecurityFilterChain authServer(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);
http.getConfigurer(OAuth2AuthorizationServerConfigurer.class).oidc(Customizer.withDefaults());
http.exceptionHandling((e) -> e.authenticationEntryPoint(new BasicAuthenticationEntryPoint()));
return http.build();
}
@Bean
@Order(2)
public SecurityFilterChain defaultChain(HttpSecurity http) throws Exception {
return http.authorizeHttpRequests((authorize) -> authorize.anyRequest().authenticated())
.httpBasic(Customizer.withDefaults())
.formLogin(f -> f.disable())
.build();
}
}
这确实会打开基本登录弹出窗口,但它会在登录时一次又一次地重新出现。我做错了什么?
您无法使用基本身份验证针对 OAuth2 授权服务器对用户进行身份验证。
您使用授权代码流程,这将涉及来自该授权服务器的 HTML 表单。
您的第二个安全过滤器链必须配置为 OAuth2 客户端,并启用
oauth2Login
(而不是 httpBasic
与 formLogin
)、会话和 CSRF 保护。
如果您不喜欢默认值,您应该能够做的是样式或替换 Spring 登录表单(这在您的授权服务器安全过滤器链配置中应该是可能的,但我不是 Spring 专家 -授权服务器,因为我只使用其他 OpenID 提供商)。