Spring Security – несколько поставщиков удостоверений OAuth2 (github и google) работают только с одним Bean-компонентом JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Spring Security – несколько поставщиков удостоверений OAuth2 (github и google) работают только с одним Bean-компонентом

Сообщение Anonymous »

У меня есть загрузочное приложение Spring версии 2.7.10, которое я хотел иметь возможность аутентифицировать с помощью двух поставщиков удостоверений ( и Google) через OAuth2.
По сути, мое веб-приложение должно позволять пользователю выбирать либо GitHub, либо Google для аутентификации, но мне не удалось заставить его работать для обоих поставщиков аутентификации, только для того, который имеет аннотацию @Primary в OAuth2ClientServiceConfig.java.
С то мне нужны две конфигурации для двух провайдеров, как показано ниже:

Код: Выделить всё


@Configuration
public class Oauth2ClientConfiguration {

@Bean(name = "github")
public ClientRegistrationRepository githubClientRegistrationRepository() {

ClientRegistration clientRegistration = ClientRegistration.withRegistrationId("github")
.clientId("GITHUB_CLIENT_ID")
.clientSecret("GITHUB_CLIENT_SECRET")
.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
.redirectUriTemplate("{baseUrl}/login/oauth2/code/{registrationId}")
.scope("user")
.authorizationUri("https://github.com/login/oauth/authorize")
.tokenUri("https://github.com/login/oauth/access_token")
.userInfoUri("https://api.github.com/user")
.userNameAttributeName("id")
.clientName("gitHub")
.build();

return new InMemoryClientRegistrationRepository(clientRegistration);

}

@Bean(name = "google")
public ClientRegistration clientRegistration = ClientRegistration.withRegistrationId("google")
.clientId("GOOGLE_CLIENT_ID")
.clientSecret("GOOGLE_CLIENT_SECRET")
.clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC)
.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
.redirectUri("{baseUrl}/login/oauth2/code/{registrationId}")
.scope("openid", "profile", "email", "address", "phone")
.authorizationUri("https://accounts.google.com/o/oauth2/v2/auth")
.tokenUri("https://www.googleapis.com/oauth2/v4/token")
.userInfoUri("https://www.googleapis.com/oauth2/v3/userinfo")
.userNameAttributeName(IdTokenClaimNames.SUB)
.jwkSetUri("https://www.googleapis.com/oauth2/v3/certs")
.clientName("Google")
.build();

return new InMemoryClientRegistrationRepository(clientRegistration);

}

}

Код: Выделить всё

@Configuration
public class OAuth2ClientServiceConfig {

@Bean(name = "githubClientService")
public OAuth2AuthorizedClientService githubAuthorizedClientService(
@Qualifier("github") ClientRegistrationRepository githubClientRegistrationRepository) {
return new InMemoryOAuth2AuthorizedClientService(githubClientRegistrationRepository);
}

@Bean(name = "googleClientService")
@Primary
public OAuth2AuthorizedClientService googleAuthorizedClientService(
@Qualifier("google")  ClientRegistrationRepository googleClientRegistrationRepository) {
return new InMemoryOAuth2AuthorizedClientService(googleClientRegistrationRepository);
}

}
  • Код: Выделить всё

    WebSecurityConfig.java
    (обратите внимание на комментарий NOTE внизу класса)

Код: Выделить всё

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
@Qualifier("githubClientService")
private OAuth2AuthorizedClientService githubOAuth2AuthorizedClientService;

@Autowired
@Qualifier("googleClientService")
private OAuth2AuthorizedClientService googleOAuth2AuthorizedClientService;

@Autowired
@Qualifier("github")
private ClientRegistrationRepository githubClientRegistrationRepository;

@Autowired
@Qualifier("google")
private ClientRegistrationRepository googleClientRegistrationRepository;

@Override
protected void configure(HttpSecurity http) throws Exception {

http
.addFilterBefore(new CustomSecurityExceptionHandlingFilter(),  UsernamePasswordAuthenticationFilter.class)
.oauth2Login()
.authorizationEndpoint()
.authorizationRequestResolver(
new CustomAuthorizationRequestResolver(
googleClientRegistrationRepository)
)
.and()
.loginPage("/login") // this one is important to not use Spring security formlogin
.clientRegistrationRepository(googleClientRegistrationRepository)
.successHandler(this::handleOAuth2Login)

}

private void handleOAuth2Login(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException {
String clientRegistrationId = "google";

OAuth2User oauth2User = (OAuth2User) authentication.getPrincipal();

// NOTE:
// - authorizedClient here is NOT null if @Primary is SET to @Bean(name = "googleClientService") in OAuth2ClientServiceConfig.java
// - authorizedClient here is null if @Primary is  SET to @Bean(name = "githubClientService") in OAuth2ClientServiceConfig.java

OAuth2AuthorizedClient authorizedClient = googleOAuth2AuthorizedClientService.loadAuthorizedClient(
clientRegistrationId, oauth2User.getName())

String accessToken = authorizedClient.getAccessToken().getTokenValue();

}

}

Я не уверен, что что-то пропустил или безопасность Spring имеет некоторые ограничения для поддержки аутентификации через несколько поставщиков удостоверений через OAuth2.

Подробнее здесь: https://stackoverflow.com/questions/786 ... le-work-wi
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»