即使端点设置为permitAll,也会检查Bearer令牌

时间:2016-11-02 12:51:34

标签: spring grails spring-security spring-security-oauth2

我正在使用带有Grails spring-security-oauth2-provider:3.0.0-RC2的{​​{1}}。所有资源端点都以3.2.1使用

开头
/api

这是过滤器链图(与文档中给出的相同):

"/api/$controller/$action?/$id?(.$format)?" {
    constraints {
    }
}

我使用密码授予身份验证,只要令牌在浏览器的本地存储中可用,就会传递String tokenFilters = "JOINED_FILTERS,-oauth2ProviderFilter,-securityContextPersistenceFilter,-logoutFilter,-authenticationProcessingFilter,-rememberMeAuthenticationFilter,-exceptionTranslationFilter" String securedResourcesFilter = "JOINED_FILTERS,-securityContextPersistenceFilter,-logoutFilter,-authenticationProcessingFilter,-rememberMeAuthenticationFilter,-oauth2BasicAuthenticationFilter,-exceptionTranslationFilter" String otherFilters = "JOINED_FILTERS,-statelessSecurityContextPersistenceFilter,-oauth2ProviderFilter,-clientCredentialsTokenEndpointFilter,-oauth2BasicAuthenticationFilter,-oauth2ExceptionTranslationFilter" grails.plugin.springsecurity.filterChain.chainMap = [ [pattern: "/api/oauth/token", filters: tokenFilters], [pattern: "/api/**", filters: securedResourcesFilter], [pattern: "/**", filters: otherFilters] ] 标题,一切正常。

我将承载令牌存储在浏览器的本地存储中。问题是令牌过期并且仍然可以在浏览器的本地存储中使用。其中一个操作标记为Authorization,因此当我点击该操作(并且还传递过期的@Secured(["permitAll"])标头)时,由于令牌过期,请求将被拒绝401。

根据设计,即使端点或控制器/操作设置为Authorization,Spring安全性仍然会检查访问令牌的有效性(如果可用)?

1 个答案:

答案 0 :(得分:2)

是的,我相信401响应是设计的。

您所描述的是OAuth2AuthenticationProcessingFilter的行为。过滤器attempts to extract the token from the request并找到一个attempts to authenticate it。如果由于某种原因(如过期的令牌)验证失败,the filter will treat it as an Authentication failure

因为OAuth2AuthenticationProcessingFilter在过滤器链中处于较高位置,所以在请求有机会进入较低级别并根据控制器注释做出决策之前,它会在无效令牌上终止请求。

基本上,如果您提供访问令牌,应用程序将尝试对其进行身份验证。

变通方法

当您从spring-security-oauth2-provider获取访问令牌时,它通常包含一些可在客户端中检查的过期信息,以防止首先发送过期的Authorization标头。您也可以考虑使用Refresh Token Grant

如果更改客户端无法正常工作,您可以配置filterChain.chainMap,以便您尝试允许的控制器操作的uri使用otherFilters,如下所示:

grails.plugin.springsecurity.filterChain.chainMap = [
    [pattern: "/api/oauth/token", filters: tokenFilters],
    [pattern: "/api/foo/myControllerActionThatIsPermitAll", filters: otherFilters],
    [pattern: "/api/**", filters: securedResourcesFilter],
    [pattern: "/**", filters: otherFilters]
]

请注意,a github issue reported on spring-security-oauth描述了您的问题。