在 Grails 3 应用程序中使用 Spring Security Rest 对“refresh_token”请求的 403 响应

Posted

技术标签:

【中文标题】在 Grails 3 应用程序中使用 Spring Security Rest 对“refresh_token”请求的 403 响应【英文标题】:403 response on a "refresh_token" request with Spring Security Rest in a Grails 3 application 【发布时间】:2019-05-10 17:45:41 【问题描述】:

我在 Grails 3 应用程序中使用 Spring Security Rest 发出“refresh_token”请求时遇到了一些问题。我有一个包含 Web 前端和一些 Rest 端点的应用程序,其他一切似乎都运行良好。 Web 应用程序的行为符合预期,当我通过 curl 发出登录请求时,

curl -i -X POST localhost:8080/api/login \
-H "Content-Type: application/json" \
-d '"username":"johndoe", "password":"johndoepassword"' 

我得到了预期的响应(我已经截断了标记):


 "username":"johndoe",
 "roles":["ROLE_USER"],
 "token_type":"Bearer",
 "access_token":"eyJhbGciOiJIUzI1NiJ9.xxxxxx",
 "expires_in":3600,
 "refresh_token":"eyJhbGciOiJIUzI1NiJ9.xxxx"

在实际应用程序中,我可以将 access_token 添加到标头中,并在会话期间毫无问题地进行身份验证。但是,当我用

点击“刷新令牌”端点时,我得到一个 403
curl -i -X POST localhost:8080/oauth/access_token \
-H "Content-Type: application/x-www-form-urlencoded"  \
-d "grant_type=refresh_token&refresh_token=eyJhbGciOiJIUzI1NiJ9.xxxx" 

这一切在文档中看起来都很简单,但我显然做错了什么。这是我认为我的配置文件的相关部分:

grails.plugin.springsecurity.controllerAnnotations.staticRules = [
    [pattern: '/error',          access: ['permitAll']],
    [pattern: '/login',          access: ['permitAll']],
    [pattern: '/login/**',          access: ['permitAll']],
    [pattern: '/oauth/**',          access: ['permitAll']],
    [pattern: '/user/register',          access: ['permitAll']],
    [pattern: '/user/register/**',          access: ['permitAll']],
    [pattern: '/user/submitRegistration',          access: ['permitAll']],
    [pattern: '/logoff',          access: ['permitAll']],
    [pattern: '/shutdown',       access: ['permitAll']],
    [pattern: '/assets/**',      access: ['permitAll']],
    [pattern: '/**/js/**',       access: ['permitAll']],
    [pattern: '/**/css/**',      access: ['permitAll']],
    [pattern: '/**/images/**',   access: ['permitAll']],
    [pattern: '/**/favicon.ico', access: ['permitAll']],
    [pattern: '/surveyAdmin/**',  access: ['ROLE_ADMIN']] ,
    [pattern: '/**',               access: ['ROLE_USER']]
]

grails.plugin.springsecurity.filterChain.chainMap = [
    [pattern: '/assets/**',      filters: 'none'],
    [pattern: '/**/js/**',       filters: 'none'],
    [pattern: '/**/css/**',      filters: 'none'],
    [pattern: '/**/images/**',   filters: 'none'],
    [pattern: '/**/favicon.ico', filters: 'none'],

    [
            pattern: '/api/**',
            filters: 'JOINED_FILTERS,-anonymousAuthenticationFilter,-exceptionTranslationFilter,-authenticationProcessingFilter,-securityContextPersistenceFilter,-rememberMeAuthenticationFilter'
    ],

    [
            pattern: '/rest/**',
            filters: 'restTokenValidationFilter,restExceptionTranslationFilter,filterInvocationInterceptor'
    ],
    [pattern: '/**',             filters: 'JOINED_FILTERS']
]

任何人都可以建议通过这里的方法吗?

谢谢, 亚历克斯

【问题讨论】:

【参考方案1】:

正如经常发生的那样,我在发布问题后不久就找到了答案。我正在使用实现 org.springframework.security.core.userdetails.UserDetails 但不扩展 org.springframework.security.core.userdetails.User 的自定义用户类。该插件假定主体可以转换为“用户”对象,这导致用户查找/令牌生成失败。要么更改我的自定义类以扩展 User,要么覆盖插件中的 refreshToken 方法以接受我的自定义用户类。

【讨论】:

以上是关于在 Grails 3 应用程序中使用 Spring Security Rest 对“refresh_token”请求的 403 响应的主要内容,如果未能解决你的问题,请参考以下文章

Grails 1.3.5 和 Spring Security Core

使用 Grails 3 和 Spring Security REST 配置 CORS

在 Grails 3 应用程序中使用 Spring Security Rest 对“refresh_token”请求的 403 响应

Grails 3 和 Spring Security - 在过滤器中验证用户

带有 grails 的 Spring Security 核心插件

Grails 3 和 Spring Security:当用户未登录时返回 401