spring security oauth2禁用基于jsessionid的会话

时间:2015-02-02 15:17:33

标签: spring-mvc spring-security spring-security-oauth2

我没有评论的声誉,否则这个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对用户本身的身份验证就可以了。我希望访问令牌是传入请求的唯一标识符。

1 个答案:

答案 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)。