Переопределить базовую аутентификацию конечной точки / oauth / token - PullRequest
0 голосов
/ 02 декабря 2019

У меня проблемы с переопределением базовой аутентификации /oauth/token, найденной в классе TokenEndpoint. Я в основном хочу добавить пользовательскую проверку учетных данных (client_id и client_secret).

Вот конфигурация сервера авторизации.

@Configuration
@EnableOAuth2Client
@EnableAuthorizationServer
public class OAuth2Configuration extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private ClientDetailsService serviceProviderClientDetailsService;

    @Autowired
    private TokenEnhancer tokenEnhancer;

    @Autowired
    private TokenStore tokenStore;

    @Autowired
    private AuthorizationCodeServices authorizationCodeServices;

    @Autowired
    private OidcWebResponseExceptionTranslator oidcWebResponseExceptionTranslator;

    @Autowired
    private OidcMnoOAuth2RequestValidator oidcOAuth2RequestValidator;

    @Override
    public void configure(final ClientDetailsServiceConfigurer clients) throws Exception {
        clients.withClientDetails(serviceProviderClientDetailsService);
    }

    @Override
    public void configure(final AuthorizationServerEndpointsConfigurer endpoints) {
        endpoints.tokenEnhancer(tokenEnhancer);
        endpoints.exceptionTranslator(oidcWebResponseExceptionTranslator);
        endpoints.authorizationCodeServices(authorizationCodeServices);
        endpoints.tokenStore(tokenStore);
        endpoints.setClientDetailsService(serviceProviderClientDetailsService);
        endpoints.tokenGranter(oidcAuthorizationCodeTokenGranter());
        endpoints.requestValidator(oidcOAuth2RequestValidator);

    }
    @Override
    public void configure(final AuthorizationServerSecurityConfigurer oauthServer) {
        oauthServer.allowFormAuthenticationForClients();
    }

    @Bean
    public OidcAuthorizationCodeTokenGranter oidcAuthorizationCodeTokenGranter() {
        return new OidcAuthorizationCodeTokenGranter();
    }

}

Заранее спасибо!

1 Ответ

1 голос
/ 03 декабря 2019

Для добавления пользовательской проверки к клиентским или пользовательским учетным данным вы можете увеличить DaoAuthenticationProvider и назначить соответствующую службу сведений о пользователе. Переопределите его additionalAuthenticationChecks(...) метод для добавления пользовательского поведения.

public class AugmentedDaoAuthenticationProvider extends DaoAuthenticationProvider {

@Override
protected void additionalAuthenticationChecks(final UserDetails userDetails, final UsernamePasswordAuthenticationToken authentication) {
    final User user = userDao.findByUsername(userDetails.getUsername())
                             .orElseThrow(() -> new BadCredentialsException("Incorrect username or password."));

    // custom authentication logic

    // Perform the actual authentication.
    super.additionalAuthenticationChecks(userDetails, authentication);

Инициализируйте компонент и назначьте соответствующую службу сведений о пользователе: если дополнительная проверка подлинности выполняется для учетных данных пользователя, тогда назначьте UserDetailsService и дляучетные данные клиента, назначьте ClientDetailsUserDetailsService

<bean id="clientAuthenticationProvider" class="com.test.AugmentedDaoAuthenticationProvider">
    <property name="userDetailsService" ref="clientDetailsUserDetailsService"/>


Решение вопроса в разделе комментариев:

ClientDetailsUserDetailsService реализует UserDetailsService и имеет конструктор, который принимает ClientDetailsService в качестве аргумента. Инициализация бина будет выглядеть следующим образом:

<bean id="clientDetailsUserDetailsService" class="org.springframework.security.oauth2.provider.client.ClientDetailsUserDetailsService">
    <constructor-arg name="clientDetailsService" ref="serviceProviderClientDetailsService"/>
</bean>

Затем вы можете ссылаться на этот clientDetailsUserDetailsService на свой DaoAuthenticationProvider.

...