Spring boot, Security, OAuth2: возможно ли использовать пользовательские AuthorizationCodeResourceDetails?Для сервера аутентификации требуются определенные параметры в URL перенаправления - PullRequest
0 голосов
/ 11 мая 2018

Я разрабатываю клиент OAuth2 с помощью SpringBoot. Стороннему серверу аутентификации требуются определенные параметры в URL-адресах перенаправления.

Мой app.yml

 acme:
    client:
      clientId:     acme
      clientSecret: acmepassword
      accessTokenUri:       http://localhost:8080/sso/oauth/token
      userAuthorizationUri: http://localhost:8080/sso/oauth/authorize
      specificParam1: specific1
      specificParam2: specific2

    resource:
      userInfoUri:    http://localhost:8080/sso/api/me

Я создал свой CustomClientResourceDetails, расширив его от AuthorizationCodeResourceDetails.

public class CustomClientResourceDetails extends AuthorizationCodeResourceDetails {
    private String specificParam1;
    private String specificParam2;
    ...    
}

И @Autowire это в моем SecurityConfig. Я также создал пользовательский фильтр

  @Configuration
    @EnableOAuth2Client
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter {      
        @Autowired
        OAuth2ClientContext oauth2ClientContext;

        @Override
        protected void configure(HttpSecurity http) throws Exception {
         ...
        .addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class);
     }

        @Bean
        public FilterRegistrationBean<OAuth2ClientContextFilter> oauth2ClientFilterRegistration(OAuth2ClientContextFilter filter) {
            FilterRegistrationBean<OAuth2ClientContextFilter> registration = new FilterRegistrationBean<OAuth2ClientContextFilter>();
            registration.setFilter(filter);
            registration.setOrder(-100);
            return registration;
        }

        private Filter ssoFilter() {
            OAuth2ClientAuthenticationProcessingFilter customFilter = new OAuth2ClientAuthenticationProcessingFilter(LOGIN);
            OAuth2RestTemplate customTemplate = new OAuth2RestTemplate(custom(), oauth2ClientContext);
            customFilter.setRestTemplate(customTemplate);
            UserInfoTokenServices tokenServices = new UserInfoTokenServices(customResource().getUserInfoUri(),
                    custom().getClientId());
            tokenServices.setRestTemplate(customTemplate);
            customFilter.setTokenServices(
                    new UserInfoTokenServices(customResource().getUserInfoUri(), custom().getClientId()));
            return customFilter;
        }

        @Bean
        @ConfigurationProperties("acme.client")
        @Primary
        public AuthorizationCodeResourceDetails custom() {
            return new CustomClientResourceDetails();
        }

        @Bean
        @ConfigurationProperties("acme.resource")
        public ResourceServerProperties customResource() {
            return new ResourceServerProperties();
        }
    }

Но конкретный параметр не включен в URL-адрес перенаправления, потому что OAuth2ClientAuthenticationProcessingFilter и связанные с ним классы работают через OAuth2RestOperations или 'OAuth2ProtectedResourceDetails', где только параметры по умолчанию.

Можно ли включить дополнительные параметры для перенаправления URL-адресов? И как?

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 14 мая 2018

Я предполагаю, что вам нужно отправить какой-то динамический параметр при перенаправлении на страницу авторизации IDP.В этом случае вы можете расширить AuthorizationCodeAccessTokenProvider и переопределить метод getRedirectForAuthorization.Вы можете добавить свой пользовательский параметр следующим образом:

// add all your custom parameter to 'requestParameters'
requestParameters.put("myCustomParameter","myCustomParameterValue");

UserRedirectRequiredException redirectException = new UserRedirectRequiredException(
                    resource.getUserAuthorizationUri(), requestParameters);
...