当前位置: 首页 > 知识库问答 >
问题:

spring安全OAuth2重定向循环

秦浩漫
2023-03-14

我有一个oauth2客户端spring启动应用程序,其依赖项为:-spring-boot 1.2.0.rc1-spring-security-OAUTH2 2.0.4.release-spring-security3.2.5.release

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

我的一些代码基于[1]重定向循环中的spring安全OAuth2(google)web应用程序

关于为什么重定向循环有什么想法吗?提前谢谢你。

[日志片段]https://gist.github.com/yterradas/61da3f6eccc683b3a086

下面是安全配置。

@Configuration
public class SecurityConfig {

  @Configuration
  @EnableWebMvcSecurity
  protected static class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private OAuth2ClientAuthenticationProcessingFilter oAuth2ClientAuthenticationProcessingFilter;

    @Autowired
    private LoginUrlAuthenticationEntryPoint vaultAuthenticationEntryPoint;

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

    @Override
    protected void configure(HttpSecurity http) throws Exception {
      // @formatter:off
      http
          .authorizeRequests()
            .antMatchers("/**").authenticated()
        .and()
          .exceptionHandling().authenticationEntryPoint(vaultAuthenticationEntryPoint)
        .and()
          .addFilterAfter(oAuth2ClientContextFilter, ExceptionTranslationFilter.class)
          .addFilterBefore(oAuth2ClientAuthenticationProcessingFilter, FilterSecurityInterceptor.class)
          .anonymous().disable();
    // @formatter:on
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
      // @formatter:off
    web
       /* TODO:
       disable debug in production
       */
       .debug(true);
    // @formatter:on
    }
  }

  @Configuration
  @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;

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

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

      return template;
    }

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

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

      return resource;
    }

    @Bean
    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;
    }

    @Bean
    LoginUrlAuthenticationEntryPoint oAuth2AuthenticationEntryPoint() {
      return new LoginUrlAuthenticationEntryPoint("/vaultLogin");
    }

    @Bean
    OAuth2ClientAuthenticationProcessingFilter oAuth2ClientAuthenticationProcessingFilter() {
      OAuth2ClientAuthenticationProcessingFilter filter =
          new OAuth2ClientAuthenticationProcessingFilter("/vaultLogin");

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

      return filter;
    }

  }
}

共有2个答案

鲁财
2023-03-14

对于其他可能出现相同问题的用户--在使用spring安全OAuth时出现重定向循环。这是因为我的防火墙阻止了对Internet的任何直接访问,我的spring boot+安全应用程序需要调用位于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”

希望这能帮上忙。

傅兴平
2023-03-14

我认为您有2个oauth2ClientContextFilters(一个是由@enableoauth2Client添加的,另一个是您手动添加到spring安全过滤器链中的)。您应该可以删除您添加的。

 类似资料:
  • 我试图在我的资源服务器上配置Swagger身份验证,以便我可以根据我的授权服务器进行身份验证。 我将资源服务器和授权服务器分开。它们都使用不同的端口在我的本地主机上启动。 端口8083上的资源服务器 每当我试图“授权”时,就会出现CORS问题。 我从另一个网站分叉了一个项目作为我的测试场地。下面是分叉项目。 https://github.com/cbriarnold/oauth2-spring-b

  • 我正在尝试构建一个Spring MVC应用程序,并使用Spring Security OAuth2保护它,提供商是Google。我能够使web应用程序在没有安全和表单登录的情况下工作。然而,我不能让谷歌的OAuth工作。谷歌应用程序设置是好的,因为我可以得到回调等工作与一个非Spring Security应用程序。 我的安全配置如下: 对Google的重定向工作良好,我得到了对过滤器的回调,并且验

  • 我试图在我的spring应用程序中使用OAuth2。 下面是我的pom.xml 在 这里怎么了?我错过了什么?

  • 当我试图通过添加以下application.yml spring boot没有将我重定向到https://www.facebook.com/dialog/oauth,而是将我重定向到http://localhost:8080/login&显示localhost重定向您太多次错误,我做错了什么?为什么spring不将请求重定向到https://www.facebook.com/dialog/oaut

  • 所以我想问题是Spring Security性和Tomcat中的HTTPS重定向的结合。有人能帮我解决这个问题吗?提前感谢,

  • 问题内容: 我一直在尝试使用Dave Syer的指南来实现OAuth2身份验证服务器,并从JHipster获得一些启发。但是我无法弄清楚它们如何协同工作。 当我使用ResourceServerConfigurerAdapter时,使用WebSecurityConfigurerAdapter的安全设置似乎被覆盖。 这是摘自几个不同示例的代码,因此它们可能混合得不好。但是我找不到OAuth2的良好文档