Spring 即使端点设置为permitAll,也会检查承载令牌

Spring 即使端点设置为permitAll,也会检查承载令牌,spring,grails,spring-security,spring-security-oauth2,Spring,Grails,Spring Security,Spring Security Oauth2,我正在用Grails3.2.1使用spring-security-oauth2-provider:3.0.0-RC2。所有资源端点都以/api开头,使用 "/api/$controller/$action?/$id?(.$format)?" { constraints { } } 这是过滤链图(与文档中给出的相同): 我正在使用密码授权身份验证,只要令牌在浏览器的本地存储中可用,通过传递授权头,一切都正常工作 我正在浏览器的本地存储器中存储承载令牌。问题是当令牌过期并且在浏览器

我正在用Grails
3.2.1
使用
spring-security-oauth2-provider:3.0.0-RC2
。所有资源端点都以
/api
开头,使用

"/api/$controller/$action?/$id?(.$format)?" {
    constraints {
    }
}
这是过滤链图(与文档中给出的相同):

我正在使用密码授权身份验证,只要令牌在浏览器的本地存储中可用,通过传递
授权
头,一切都正常工作

我正在浏览器的本地存储器中存储承载令牌。问题是当令牌过期并且在浏览器的本地存储中仍然可用时。其中一个操作被标记为
@Secured([“permitAll”])
,因此当我执行该操作时(同时也传递了过期的
授权
头),由于令牌已过期,请求将被401拒绝


这是否是出于设计,即使端点或控制器/操作设置为
permitAll
,spring security仍将检查访问令牌的有效性(如果可用)?

是的,我相信
401
响应是出于设计

您描述的是OAuth2AuthenticationProcessingFilter的行为。在找到一个过滤器后,将其关闭。如果身份验证因某种原因(如过期令牌)失败

由于
OAuth2AuthenticationProcessingFilter
在筛选器链中处于较高位置,因此在请求有机会转到较低级别并根据控制器注释做出决定之前,它会在无效令牌上终止请求

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

权变措施 当您从spring-security-oauth2-provider获取访问令牌时,它通常包含一些过期信息,可以在客户端中检查这些信息,以防止过期的授权头首先被发送。您还可以考虑使用

如果更改客户端不起作用,您可以配置
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]
]

请注意,这里有一些描述您的问题的信息。

谢谢@Colin。我只是在找这个。这是我主要关心的问题,如果这是默认的实现或是一个问题。
grails.plugin.springsecurity.filterChain.chainMap = [
    [pattern: "/api/oauth/token", filters: tokenFilters],
    [pattern: "/api/foo/myControllerActionThatIsPermitAll", filters: otherFilters],
    [pattern: "/api/**", filters: securedResourcesFilter],
    [pattern: "/**", filters: otherFilters]
]