gpt4 book ai didi

spring - 即使端点设置为 permitAll,也会检查不记名 token

转载 作者:行者123 更新时间:2023-12-02 01:20:45 26 4
gpt4 key购买 nike

我正在使用 spring-security-oauth2-provider:3.0.0-RC2 和 Grails 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]
]

我正在使用密码授予身份验证,只要 token 在浏览器的本地存储中可用,通过传递 Authorization header 一切正常。

我将不记名 token 存储在浏览器的本地存储中。问题是当 token 过期并且在浏览器的本地存储中仍然可用时。其中一个操作被标记为 @Secured(["permitAll"]) 所以当我点击该操作时(并且过期的 Authorization header 也被传递),由于 token 已过期,请求被 401 拒绝。

这是设计使然,即使端点或 Controller /操作设置为 permitAll,spring security 仍将检查访问 token 的有效性(如果可用)吗?

最佳答案

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

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

因为 OAuth2AuthenticationProcessingFilter 在过滤器链中处于较高位置,它会在请求有机会进入较低级别并根据 Controller 注释做出决定之前终止对无效 token 的请求.

基本上,如果您出示访问 token ,应用程序将尝试对其进行身份验证。

解决方法

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

如果更改客户端不起作用,您可以配置 filterChain.chainMap,以便您尝试允许的 Controller 操作的 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描述了您的问题。

关于spring - 即使端点设置为 permitAll,也会检查不记名 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40380419/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com