我没有评论的声誉,否则这个post描述了完全相同的问题。
我已经在spring 4应用程序中成功实现了spring security oauth2 2.0.5。一切正常,我可以生成令牌和api请求进行适当的身份验证。但问题是,一旦api在基于浏览器的应用程序中使用访问令牌进行身份验证,后续调用就不需要访问令牌,因为 - 似乎spring security依赖于sessionid来识别和验证用户。 - 即使在访问令牌到期后,调用似乎也会验证。
所以看来spring只依赖于第一次调用的访问令牌,然后它依赖于cookie / jsessionid。我尝试以下列方式禁用行为(从sparklr2学习) -
Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.anonymous().disable();
//oauth2 recommends that oauth token url should be only available to authorized clients
http.requestMatchers().antMatchers("/oauth/token").and().authorizeRequests().anyRequest().fullyAuthenticated();
http.httpBasic().authenticationEntryPoint(oAuth2AuthenticationEntryPoint()).and()
.addFilterBefore(clientCredentialsTokenEndpointFilter(), BasicAuthenticationFilter.class)
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and().exceptionHandling()
.accessDeniedHandler(oAuth2AccessDeniedHandler);
}
但这没有用。在日志中,我可以看到 -
尝试使用Ant匹配[pattern =' / oauth / token']检查匹配 要求:' /v1.0/printconfig /&#39 ;;反对' / oauth / token'试着匹配 使用Ant [pattern =' / oauth / token_key']检查请求的匹配: ' /v1.0/printconfig /&#39 ;;反对' / oauth / token_key'试着匹配使用 Ant [pattern =' / oauth / check_token']检查请求的匹配: ' /v1.0/printconfig /&#39 ;;反对' / oauth / check_token'找不到匹配项 尝试使用Ant进行匹配[pattern =' /v1.0/ ']检查匹配 要求:' /v1.0/printconfig /&#39 ;;反对' /v1.0 / '匹配 /v1.0/printconfig/在附加过滤器链中位置1的10; 触发过滤器:' WebAsyncManagerIntegrationFilter' /v1.0/printconfig/ 在附加过滤链中的位置2的10; 触发过滤器: ' SecurityContextPersistenceFilter'获得有效的SecurityContext 来自SPRING_SECURITY_CONTEXT: ' org.springframework.security.core.context.SecurityContextImpl@bd392350: 验证: org.springframework.security.oauth2.provider.OAuth2Authentication@bd392350: 负责人:org.springframework.security.core.userdetails.User@6d: 用户名:m;密码保护];启用:true; AccountNonExpired: 真正; credentialsNonExpired:true; AccountNonLocked:true;诚然 当局:ROLE_USER;证书:[保护];认证:真实; 详细信息:remoteAddress = 0:0:0:0:0:0:0:1,tokenValue =;诚然 当局:ROLE_USER' /v1.0/printconfig/位于10的位置3 额外的过滤链;触发过滤器:' HeaderWriterFilter'不 注入HSTS标头,因为它与requestMatcher 不匹配 org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequestMatcher@6044b89b /v1.0/printconfig/在附加过滤器链中的位置4 of 10; 触发过滤器:' LogoutFilter'检查请求的匹配: ' /v1.0/printconfig /&#39 ;;反对' /注销' /v1.0/printconfig/在位置 另外10个过滤链中的5个;射击过滤器: 的> ' OAuth2AuthenticationProcessingFilter'标题中找不到令牌。 尝试请求参数。在请求参数中找不到令牌。不 OAuth2请求。请求中没有令牌,将继续链。 /v1.0/printconfig/在附加过滤器链中的位置6的10; 触发过滤器:' RequestCacheAwareFilter' /v1.0/printconfig/ at 另外10个过滤链中的第7个位置;射击过滤器: ' SecurityContextHolderAwareRequestFilter' /v1.0/printconfig/ at 在附加过滤链中的第8个位置;射击过滤器: ' SessionManagementFilter' /v1.0/printconfig/在10的位置9中 额外的过滤链;触发过滤器:' ExceptionTranslationFilter' /v1.0/printconfig/在10位10的附加过滤链中; 触发过滤器:' FilterSecurityInterceptor'检查请求的匹配: ' /v1.0/printconfig /&#39 ;;反对' /v1.0 / **'安全对象: FilterInvocation:URL:/v1.0/printconfig/;属性: [#oauth2.throwOnError(hasRole(' ROLE_USER'))]以前经过身份验证: org.springframework.security.oauth2.provider.OAuth2Authentication@bd392350: 负责人:org.springframework.security.core.userdetails.User@6d: 用户名:m;密码保护];启用:true; AccountNonExpired: 真正; credentialsNonExpired:true; AccountNonLocked:true;诚然 当局:ROLE_USER;证书:[保护];认证:真实; 详细信息:remoteAddress = 0:0:0:0:0:0:0:1,tokenValue =;诚然 当局:ROLE_USER选民: org.springframework.security.web.access.expression.WebExpressionVoter@5f574bdc, 返回:1授权成功RunAsManager没有更改 身份验证对象/v1.0/printconfig/已达到附加结束 过滤链;继续处理原始链条链正常处理 SecurityContextHolder现已清除,请求处理完成
正如您所看到的,oauth令牌标头不存在,但仍然有一个不同的过滤器标识了会话。我想要禁用sessionId本身,但只是禁用Spring对用户本身的身份验证就可以了。我希望访问令牌是传入请求的唯一标识符。
答案 0 :(得分:1)
我认为/v1.0/printconfig/
是OAuth2AuthenticationProcessingFilter
背后受OAuth2保护的资源,您的客户端是否发送了Cookie而不是令牌?如果这是正确的,则2.0.5中的默认行为如您所见(接受cookie,并允许您在自己的配置中控制访问规则)。默认值在2.0.6中更改(除非明确配置资源服务器,否则cookie将无法运行:https://github.com/spring-projects/spring-security-oauth/blob/master/spring-security-oauth2/src/main/java/org/springframework/security/oauth2/config/annotation/web/configurers/ResourceServerSecurityConfigurer.java#L94)。