Spring Security OAuth2重定向循环

spring-security spring-boot spring-security-oauth2

4756 观看

3回复

98 作者的声誉

我有一个带有依赖项的oauth2客户端spring-boot应用程序: - spring-boot 1.2.0.RC1 - spring-security-oauth2 2.0.4.RELEASE - spring-security 3.2.5.RELEASE

客户端进行身份验证,身份验证在SecurityContextHolder中设置,但是当请求重定向到原始URL时,筛选器链再次开始处理。我注意到在SecurityContextPersistenceFiltercontextBeforeChainExecution和contextAfterChainExecution都有一个null身份验证。

在重定向循环中基于[1] Spring Security OAuth2(谷歌)Web应用程序的一些代码

有关为什么重定向循环的任何想法?先感谢您。

[Logs snippet] https://gist.github.com/yterradas/61da3f6eccc683b3a086

以下是安全配置。

@组态
公共类SecurityConfig {

  @组态
  @EnableWebMvcSecurity
  protected static class WebSecurityConfig扩展WebSecurityConfigurerAdapter {

    @Autowired
    private OAuth2ClientAuthenticationProcessingFilter oAuth2ClientAuthenticationProcessingFilter;

    @Autowired
    private LoginUrlAuthenticationEntryPoint vaultAuthenticationEntryPoint;

    @SuppressWarnings({ “SpringJavaAutowiringInspection”})
    @Autowired
    private OAuth2ClientContextFilter oAuth2ClientContextFilter;

    @覆盖
    protected void configure(HttpSecurity http)抛出Exception {
      // @formatter:关闭
      HTTP
          .authorizeRequests()
            .antMatchers( “/ **”)。认证()
        。和()
          .exceptionHandling()。的AuthenticationEntryPoint(vaultAuthenticationEntryPoint)
        。和()
          .addFilterAfter(oAuth2ClientContextFilter,ExceptionTranslationFilter.class)
          .addFilterBefore(oAuth2ClientAuthenticationProcessingFilter,FilterSecurityInterceptor.class)
          .anonymous()禁用();
    // @formatter:on
    }

    @覆盖
    public void configure(WebSecurity web)抛出Exception {
      // @formatter:关闭
    卷筒纸
       /* 去做:
       在生产中禁用调试
       * /
       的.debug(真);
    // @formatter:on
    }
  }

  @组态
  @ EnableOAuth2Client
  protected static class ClientSecurityConfig {

    @Value(“$ {app.name}”)private String appId;
    @Value(“$ {app.clientId}”)private String appClientId;
    @Value(“$ {app.clientSecret}”)private String appClientSecret;
    @Value(“$ {app.redirectUrl}”)private String appRedirectUrl;
    @Value(“$ {vault.accessTokenUrl}”)private String vaultAccessTokenUrl;
    @Value(“$ {vault.userAuthorizationUrl}”)private String vaultUserAuthorizationUrl;
    @Value(“$ {vault.checkTokenUrl}”)private String vaultCheckTokenUrl;

    @SuppressWarnings({ “SpringJavaAutowiringInspection”})
    @Resource
    @Qualifier( “oauth2ClientContext”)
    private OAuth2ClientContext oAuth2ClientContext;

    @Autowired
    @Qualifier( “securityDataSource”)
    private DataSource securityDataSource;

    @Autowired
    private MappingJackson2HttpMessageConverter jackson2HttpMessageConverter;

    @豆
    public OAuth2RestOperations oAuth2RestOperations(){
      AccessTokenProviderChain provider = new AccessTokenProviderChain(
          Arrays.asList(new AuthorizationCodeAccessTokenProvider())
      );
      provider.setClientTokenServices(new JdbcClientTokenServices(securityDataSource));

      OAuth2RestTemplate template = new OAuth2RestTemplate(oAuth2Resource(),oAuth2ClientContext);
      template.setAccessTokenProvider(提供商);
      template.setMessageConverters(Arrays.asList(jackson2HttpMessageConverter));

      返回模板;
    }

    @豆
    OAuth2ProtectedResourceDetails oAuth2Resource(){
      AuthorizationCodeResourceDetails resource = new AuthorizationCodeResourceDetails();

      resource.setId(APPID);
      resource.setAuthenticationScheme(AuthenticationScheme.query);
      resource.setAccessTokenUri(vaultAccessTokenUrl);
      resource.setUserAuthorizationUri(vaultUserAuthorizationUrl);
      resource.setUseCurrentUri(假);
      resource.setPreEstablishedRedirectUri(appRedirectUrl);
      resource.setClientId(appClientId);
      resource.setClientSecret(appClientSecret);
      resource.setClientAuthenticationScheme(AuthenticationScheme.form);

      返回资源;
    }

    @豆
    ResourceServerTokenServices oAuth2RemoteTokenServices(){
      VaultTokenServices tokenServices = new VaultTokenServices();

      RestTemplate restOperations = new RestTemplate();
      restOperations.setMessageConverters(Arrays.asList(jackson2HttpMessageConverter));

      tokenServices.setRestTemplate(restOperations);
      tokenServices.setClientId(appClientId);
      tokenServices.setClientSecret(appClientSecret);
      tokenServices.setCheckTokenEndpointUrl(vaultCheckTokenUrl);

      return tokenServices;
    }

    @豆
    LoginUrlAuthenticationEntryPoint oAuth2AuthenticationEntryPoint(){
      返回新的LoginUrlAuthenticationEntryPoint(“/ vaultLogin”);
    }

    @豆
    OAuth2ClientAuthenticationProcessingFilter oAuth2ClientAuthenticationProcessingFilter(){
      OAuth2ClientAuthenticationProcessingFilter filter =
          新的OAuth2ClientAuthenticationProcessingFilter(“/ vaultLogin”);

      filter.setRestTemplate(oAuth2RestOperations());
      filter.setTokenServices(oAuth2RemoteTokenServices());

      返回过滤器;
    }

  }
}
作者: Yoandy Terradas 的来源 发布者: 2014 年 11 月 14 日

回应 (3)


2

45800 作者的声誉

我认为你有2个OAuth2ClientContextFilters(一个是添加的@EnableOAuth2Client,你已经手动添加到Spring Security过滤器链)。您应该能够删除您添加的那个。

作者: Dave Syer 发布者: 15.11.2014 11:18

0

98 作者的声誉

我发现了一个平庸的解决方案,需要从中删除几乎所有的过滤器SecurityFilterChain。不幸的是,我没有我工作的应用程序的工作副本。但是,通过在打破应用程序之前删除尽可能多的过滤器然后只添加必要的过滤器来复制解决方案应该很容易。如果记忆能够帮助我,那么罪魁祸首就是SecurityContextPersistenceFilter或者RequestCacheAwareFilter

作者: Yoandy Terradas 发布者: 20.06.2015 08:13

0

151 作者的声誉

对于其他可能带来相同问题的人来说 - 使用Spring Security oAuth时的重定向循环。我有这个,因为我在阻止任何直接访问Internet的防火墙后面,我的Spring Boot + Security应用程序需要调用位于Internet上的IdP的userinfo端点,例如Okta,Google等。可以通过在本地运行配置中配置代理来修复它,如下所示:

-Dhttp.proxyHost=yourhttpproxy.company.com 
-Dhttp.proxyPort=yourhttproxyport
-Dhttp.nonProxyHosts=”localhost|*.yourintranetdomain1.com|*.yourintranetdomain2.com|etc” 
-Dhttps.proxyHost=yourhttpsproxy.company.com
-Dhttps.proxyPort=yourhttpsproxyport 
-Dhttps.nonProxyHosts=”localhost|*.yourintranetdomain1.com|*.yourintranetdomain2.com|etc”

我希望这有帮助。

作者: Bernd 发布者: 17.06.2018 02:37
32x32