Spring boot,Security,OAuth2:是不是可以使用自定义 AuthorizationCodeResourceDetails?身份验证服务器需要重定向 url 中的特定参数

Posted

技术标签:

【中文标题】Spring boot,Security,OAuth2:是不是可以使用自定义 AuthorizationCodeResourceDetails?身份验证服务器需要重定向 url 中的特定参数【英文标题】:Spring boot, Security, OAuth2: Is possible to use custom AuthorizationCodeResourceDetails? Auth server requires specific params in redirect urlSpring boot,Security,OAuth2:是否可以使用自定义 AuthorizationCodeResourceDetails?身份验证服务器需要重定向 url 中的特定参数 【发布时间】:2018-10-21 22:23:30 【问题描述】:

我正在使用 SpringBoot 开发 OAuth2 客户端。第三方身份验证服务器需要重定向 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

我通过扩展 AuthorizationCodeResourceDetails 创建了我的 CustomClientResourceDetails

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

然后在我的 SecurityConfig 中 @Autowire 它。我还创建了一个自定义过滤器

  @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”工作,其中只有默认参数。

是否可以包含额外的参数来重定向网址?以及如何?

感谢您的帮助!

【问题讨论】:

【参考方案1】:

我假设您需要在重定向到 IDP 的授权页面时发送一些动态参数。在这种情况下,您可以扩展AuthorizationCodeAccessTokenProvider 并覆盖方法getRedirectForAuthorization。您可以像这样添加自定义参数:

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

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

【讨论】:

谢谢你,你是对的。我是这样做的。有link的例子。

以上是关于Spring boot,Security,OAuth2:是不是可以使用自定义 AuthorizationCodeResourceDetails?身份验证服务器需要重定向 url 中的特定参数的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security with Boot

spring boot Security 简单使用

Spring Boot Security

Understand Spring Security Architecture and implement Spring Boot Security

如何使用 Spring-Boot 播种 Spring-Security

Spring Boot整合Spring Security总结