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