Spring Security OAuth2报错:缺少ClientRegistrationRepository Bean
Spring Security OAuth2 授权报错:ClientRegistrationRepository Bean 未找到解决方案
一、ClientRegistrationRepository 的作用
这个 Bean 是 Spring Security OAuth2 客户端模块的核心组件,负责存储第三方登录平台(如Google、GitHub)的客户端注册信息,包括客户端ID、客户端密钥、授权地址、令牌地址、用户信息地址等。OAuth2登录流程的初始化、请求转发、令牌校验等环节都依赖它提供的配置信息,没有该Bean,Spring Security无法构建OAuth2相关的过滤器链,因此抛出找不到Bean的错误。
二、问题原因
你的配置类中启用了.oauth2Login()(OAuth2登录功能),但既没有在配置文件中定义第三方登录的客户端信息,也没有手动创建ClientRegistrationRepository Bean,导致Spring Boot自动配置无法生成该Bean。
三、解决方案
根据你的实际需求选择以下方案:
方案1:保留OAuth2第三方登录功能
在application.properties或application.yml中添加第三方登录平台的配置(以Google为例),Spring Boot会自动生成ClientRegistrationRepository Bean:
# Google OAuth2 客户端配置 spring.security.oauth2.client.registration.google.client-id=你的Google客户端ID spring.security.oauth2.client.registration.google.client-secret=你的Google客户端密钥 spring.security.oauth2.client.registration.google.scope=email,profile spring.security.oauth2.client.registration.google.redirect-uri={baseUrl}/login/oauth2/code/{registrationId} # Google 身份提供商配置 spring.security.oauth2.client.provider.google.authorization-uri=https://accounts.google.com/o/oauth2/v2/auth spring.security.oauth2.client.provider.google.token-uri=https://oauth2.googleapis.com/token spring.security.oauth2.client.provider.google.user-info-uri=https://www.googleapis.com/oauth2/v3/userinfo spring.security.oauth2.client.provider.google.user-name-attribute=sub
注:客户端ID和密钥需要到对应平台的开发者后台申请。
方案2:不需要OAuth2第三方登录功能
直接删除配置类中.oauth2Login()相关的代码块,这样Spring Security就不会依赖OAuth2相关组件,报错自动消失。修改后的filterChain方法如下:
@Bean protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests() .requestMatchers("/").permitAll() .requestMatchers("/shop/**").permitAll() .requestMatchers("/register").permitAll() .requestMatchers("/h2-console/**").permitAll() .requestMatchers("/admin/**").hasRole("ADMIN") .anyRequest() .authenticated() .and() .formLogin() .loginPage("/login") .permitAll() .failureUrl("/login?error=true") .defaultSuccessUrl("/") .usernameParameter("email") .passwordParameter("password") .and() .logout() .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) .logoutSuccessUrl("/login") .invalidateHttpSession(true) .deleteCookies("JSESSIONID") .and() .exceptionHandling() .and() .csrf() .disable(); http.headers().frameOptions().disable(); return http.build(); }
方案3:自定义ClientRegistrationRepository(进阶)
如果需要从数据库或其他数据源加载客户端配置,可以手动创建该Bean:
import org.springframework.security.oauth2.client.registration.ClientRegistration; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository; import org.springframework.security.oauth2.core.AuthorizationGrantType; import org.springframework.security.oauth2.core.oidc.IdTokenClaimNames; @Bean public ClientRegistrationRepository clientRegistrationRepository() { ClientRegistration googleClient = ClientRegistration.withRegistrationId("google") .clientId("你的客户端ID") .clientSecret("你的客户端密钥") .authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE) .redirectUri("{baseUrl}/login/oauth2/code/{registrationId}") .scope("email", "profile") .authorizationUri("https://accounts.google.com/o/oauth2/v2/auth") .tokenUri("https://oauth2.googleapis.com/token") .userInfoUri("https://www.googleapis.com/oauth2/v3/userinfo") .userNameAttributeName(IdTokenClaimNames.SUB) .clientName("Google") .build(); return new InMemoryClientRegistrationRepository(googleClient); }
内容的提问来源于stack exchange,提问作者vagabond
相关产品推荐
相关产品推荐

