Grails Spring Security 插件:Getting 302 for Ajax Request for timeout Session

Posted

技术标签:

【中文标题】Grails Spring Security 插件:Getting 302 for Ajax Request for timeout Session【英文标题】:Grails Spring Security plugin: Getting 302 for Ajax Request for timedout Session 【发布时间】:2014-05-28 16:48:54 【问题描述】:

我们使用 Spring Security 插件版本 1.2.7.3 和 Grails 2.2.1。 在我的Config.groovy 中,我这样做了:

grails.plugins.springsecurity.auth.ajaxLoginFormUrl = "/mylogin/authAjax"

认为,当有 Ajax 请求时,如果用户的 HttpSession 超时,Spring Security 将在 MyloginController 中调用 authAjax()

根据文档,我确保标头 X-Requested-With 的值为 XMLHttpRequest 在 Ajax 请求中,因此插件知道它是 Ajax 请求。

我的期望是 authAjax() 将被调用,我可以让它返回 401,所以 UI 知道它需要弹出另一个登录屏幕。

但是,不是调用 authAjax(),而是将 302 返回到 UI,并将位置字段设置为 http://localhost:8080/MyApplication/mycontroller/authAjax

这意味着我必须在我的 UI 上添加一些非常老套的东西,检查 302 并检查位置字段,然后让用户重新登录。我更希望返回 401。

任何想法我做错了什么?

谢谢一百万。

【问题讨论】:

可能是您的 authAjax 网址不允许所有人使用。 你解决了这个问题吗? 【参考方案1】:

如果其他人有这个问题,我发现它只是由于 chainMap 规则。 我的 REST api 位于 '/api/' url 下,所以我的 chainMap 看起来像这样:

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'], // Stateless API
    [pattern: '/**',             filters: 'JOINED_FILTERS,-restTokenValidationFilter,-restExceptionTranslationFilter'] // Traditional, session based accesses.
]

最后两行是重要的; '/api/**' 由 Spring Security REST 插件保护,该插件是一个无状态连接(即每个请求都带有身份验证令牌)。 '/**' 规则涵盖了需要有状态会话(非 REST 活动)的所有其他内容。 如果令牌已过期或以任何方式无效,则无状态 REST 请求将返回 402,而有状态的非 REST 请求将返回 302 并循环发送您的浏览器。

以正确的顺序获取这些规则,你应该没问题。

【讨论】:

以上是关于Grails Spring Security 插件:Getting 302 for Ajax Request for timeout Session的主要内容,如果未能解决你的问题,请参考以下文章

Grails,Spring Security LDAP 插件

在 grails 中使用 spring-security 插件时出错

使用 Spring Security Grails 插件编码密码

Grails - 卸载 Spring Security Core

通过 Spring Security 配置 Grails 配置插件 grails-ckeditor

带有 grails 的 Spring Security 核心插件