spring security oauth2 禁用基于 jsessionid 的会话

Pee*_*ush 7 spring-mvc spring-security spring-security-oauth2

我没有评论的声誉,否则这篇文章描述了完全相同的问题。

我已经在 spring 4 应用程序中成功实现了 spring security oauth2 2.0.5。一切正常,我可以生成令牌并且 api 请求已正确验证。但问题是,一旦 api 在基于浏览器的应用程序中使用访问令牌进行身份验证,后续调用就不需要访问令牌,因为 - 似乎 spring 安全性依赖于 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);

    }
Run Code Online (Sandbox Code Playgroud)

但这无济于事。在日志中我可以看到 -

尝试使用 Ant 匹配 [pattern='/oauth/token'] 检查请求匹配:'/v1.0/printconfig/'; 针对'/oauth/token' 尝试使用 Ant 进行匹配 [pattern='/oauth/token_key'] 检查请求的匹配:'/v1.0/printconfig/'; 针对 '/oauth/token_key' 尝试使用 Ant 匹配 [pattern='/oauth/check_token'] 检查请求匹配:'/v1.0/printconfig/'; 针对'/oauth/check_token' 未找到匹配项 尝试使用 Ant [pattern='/v1.0/ '] 检查匹配请求:' /v1.0/ printconfig/'; 与“/v1.0/ ”匹配的 /v1.0/printconfig/ 位于附加过滤器链中的第 1 个位置(共 10 个);触发过滤器:'WebAsyncManagerIntegrationFilter' /v1.触发过滤器:'SecurityContextPersistenceFilter' 从 SPRING_SECURITY_CONTEXT 获得有效的 SecurityContext:'org.springframework.security.core.context.SecurityContextImpl@bd392350:认证:org.springframework.security.oauth2.provider.OAuth2Authentication@bd392350.frameworkPrincipal security.core.userdetails.User@6d:用户名:m;密码保护]; 启用:真;AccountNonExpired:真;凭证未过期:真;帐户非锁定:真;授予权限:ROLE_USER;凭据:[受保护];已认证:真实;详细信息:remoteAddress=0:0:0:0:0:0:0:1,tokenValue=;授予的权限:ROLE_USER' /v1.0/printconfig/ 在附加过滤器链中的第 3 个位置(共 10 个);触发过滤器:'HeaderWriterFilter' 不注入 HSTS 标头,因为它与 requestMatcher 不匹配 org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequestMatcher@6044b89b /v1.0/printconfig/ 在附加过滤器链中的第 4 个位置;触发过滤器:'LogoutFilter' 检查请求匹配:'/v1.0/printconfig/'; 针对“/logout”/v1.0/printconfig/ 在附加过滤器链中的第 5 个位置(共 10 个);触发过滤器: > 'OAuth2AuthenticationProcessingFilter' 在标头中找不到令牌。尝试请求参数。在请求参数中找不到令牌。不是 OAuth2 请求。请求中没有令牌,将继续链。 /v1.0/printconfig/ 在附加过滤器链中的第 6 个位置(共 10 个);触发过滤器:'RequestCacheAwareFilter' /v1.0/printconfig/ 在附加过滤器链中的第 7 个位置(共 10 个);触发过滤器:'SecurityContextHolderAwareRequestFilter' /v1.0/printconfig/ 在附加过滤器链中的第 8 个位置(共 10 个);触发过滤器:'SessionManagementFilter' /v1.0/printconfig/ 在附加过滤器链中的第 9 个位置(共 10 个);触发过滤器:'ExceptionTranslationFilter' /v1.0/printconfig/ 在附加过滤器链中的第 10 个位置;触发过滤器:'FilterSecurityInterceptor' 检查请求匹配:'/v1.0/printconfig/'; 针对“/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;密码保护]; 启用:真;AccountNonExpired:真;凭证未过期:真;帐户非锁定:真;授予权限: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/ 已到达附加过滤器链的末端;继续正常处理的原始链 Chain 现在已清除 SecurityContextHolder,因为请求处理已完成 provider.OAuth2Authentication@bd392350:委托人:org.springframework.security.core.userdetails.User@6d:用户名:m;密码保护]; 启用:真;AccountNonExpired:真;凭证未过期:真;帐户非锁定:真;授予权限: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/ 已到达附加过滤器链的末端;继续正常处理的原始链 Chain 现在已清除 SecurityContextHolder,因为请求处理已完成 provider.OAuth2Authentication@bd392350:委托人:org.springframework.security.core.userdetails.User@6d:用户名:m;密码保护]; 启用:真;AccountNonExpired:真;凭证未过期:真;帐户非锁定:真;授予权限: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/ 已到达附加过滤器链的末端;继续正常处理的原始链 Chain 现在已清除 SecurityContextHolder,因为请求处理已完成 userdetails.User@6d:用户名:m;密码保护]; 启用:真;AccountNonExpired:真;凭证未过期:真;帐户非锁定:真;授予权限: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/ 已到达附加过滤器链的末端;继续正常处理的原始链 Chain 现在已清除 SecurityContextHolder,因为请求处理已完成 userdetails.User@6d:用户名:m;密码保护]; 启用:真;AccountNonExpired:真;凭证未过期:真;帐户非锁定:真;授予权限: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/ 已到达附加过滤器链的末端;继续正常处理的原始链 Chain 现在已清除 SecurityContextHolder,因为请求处理已完成 角色用户;凭据:[受保护];已认证:真实;详细信息: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/ 已到达附加过滤器链的末端;继续正常处理原始链 Chain 现在已清除 SecurityContextHolder,因为请求处理已完成 角色用户;凭据:[受保护];已认证:真实;详细信息: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/ 已到达附加过滤器链的末端;继续正常处理的原始链 Chain 现在已清除 SecurityContextHolder,因为请求处理已完成 0/printconfig/ 到达附加过滤器链的末端;继续正常处理的原始链 Chain 现在已清除 SecurityContextHolder,因为请求处理已完成 0/printconfig/ 到达附加过滤器链的末端;继续正常处理的原始链 Chain 现在已清除 SecurityContextHolder,因为请求处理已完成

如您所见,oauth 令牌标头不存在,但仍然有不同的过滤器识别了会话。我很想禁用 sessionId 本身,但只禁用 spring 对用户本身的身份验证就可以了。我希望访问令牌成为传入请求的唯一标识符。

Dav*_*yer 2

在我看来,/v1.0/printconfig/是 OAuth2 受保护的资源OAuth2AuthenticationProcessingFilter,而您的客户端发送的是 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)。