Spring 即使端点设置为permitAll,也会检查承载令牌
我正在用GrailsSpring 即使端点设置为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 { } } 这是过滤链图(与文档中给出的相同): 我正在使用密码授权身份验证,只要令牌在浏览器的本地存储中可用,通过传递授权头,一切都正常工作 我正在浏览器的本地存储器中存储承载令牌。问题是当令牌过期并且在浏览器
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]
]