我正在使用带有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安全性仍然会检查访问令牌的有效性(如果可用)?
答案 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描述了您的问题。