You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Security OAuth2Login自定义AuthenticationProvider未触发问题

问题原因

你配置的自定义AuthenticationProvider未被调用,核心原因是Spring Security的OAuth2登录流程不依赖全局AuthenticationManager。你通过configure(AuthenticationManagerBuilder)注册的提供者,仅作用于传统认证方式(如表单登录、HTTP Basic),而OAuth2登录有独立的认证链路,默认由OAuth2LoginAuthenticationProvider处理,不会触发全局配置的提供者。

解决方案

要让自定义认证提供者参与OAuth2登录流程,需将其注册到OAuth2登录专属的认证提供者链中,而非全局AuthenticationManager。通过oauth2Login()的配置器即可完成指定。

修改后的代码示例

1. 调整SecurityConfig配置类

修改configure(HttpSecurity)中的oauth2Login配置,添加自定义认证提供者:

@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true, prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter
{
    @Value("${keycloak.logout.uri}")
    private String logoutUri;

    @Autowired
    private KeycloakAuthenticationProvider authProvider;

    @Override
    protected void configure(final HttpSecurity http) throws Exception
    {
        // Required for zkoss-uploads
        http.headers()
                .frameOptions()
                .disable();

        // Required for zkoss-logins
        http.csrf().disable();

        // Authorization on request
        http.authorizeRequests()
                .antMatchers("/actuator/**")
                .permitAll()
                .anyRequest()
                .authenticated();

        // OAuth2 Client
        http.oauth2Client();

        // OAuth2 Login - 注册自定义认证提供者
        http.oauth2Login(oauth2 -> oauth2
                .authenticationProvider(authProvider)
        );

        // Logout handling
        http.logout().logoutSuccessUrl(logoutUri);
    }
}

2. 优化自定义AuthenticationProvider的supports方法

为了逻辑严谨,建议明确指定支持OAuth2登录的认证令牌类型:

@Component
public class KeycloakAuthenticationProvider implements AuthenticationProvider
{
    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException
    {
        System.out.println("authenticate");
        // 后续可在此添加自定义逻辑,比如处理Keycloak返回的用户信息、转换权限等
        return authentication;
    }

    @Override
    public boolean supports(Class<?> authentication)
    {
        System.out.println("support");
        // 明确匹配OAuth2登录的认证令牌类型
        return OAuth2LoginAuthenticationToken.class.isAssignableFrom(authentication);
    }
}
补充说明
  • 若需保留默认OAuth2登录逻辑并追加自定义处理,直接注册自定义提供者即可(默认提供者会被自动包含在链路中);若需完全替换默认逻辑,仅注册自定义提供者即可。
  • 在自定义提供者的authenticate方法中,可通过OAuth2LoginAuthenticationToken获取授权服务器返回的用户信息、令牌等数据,用于业务扩展(如转换为系统内部权限体系)。

内容的提问来源于stack exchange,提问作者npriebe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 01:45:31