我有一个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; } } }
对于其他可能出现相同问题的用户--在使用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”
希望这能帮上忙。
我认为您有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的良好文档