由于重定向循环,Grails Spring Security 无法显示登录页面
Posted
技术标签:
【中文标题】由于重定向循环,Grails Spring Security 无法显示登录页面【英文标题】:Grails spring security fails to present the login page due to a redirect loop 【发布时间】:2014-01-07 06:31:43 【问题描述】:我已将当前的 spring 安全插件升级到
spring-security-core-2.0-RC2 spring-security-ui-1.0-RC1问题
我注意到我的登录屏幕不再显示。在 Chrome 中它说 此页面有一个重定向循环
重现问题的步骤
所以我尝试创建一个名为 Test 的全新应用程序来尝试隔离问题。
首先,我通过在 BuildConfig.groovy 中添加以下条目来安装 security 和 security-ui 插件:
compile ":spring-security-core:2.0-RC2"
compile ":spring-security-ui:1.0-RC1"
第二次我运行快速启动命令如下:
grails s2-quickstart security Person Authority Requestmap
它在一个名为 security 的包下创建了 4 个域对象,如下所示:Authority.groovy、Person.groovy、PersonAuthority.groovy 和 Requestmap.groovy
以及将以下内容添加到我的 Config.groovy
// Added by the Spring Security Core plugin:
grails.plugin.springsecurity.userLookup.userDomainClassName = 'security.Person'
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'security.PersonAuthority'
grails.plugin.springsecurity.authority.className = 'security.Authority'
grails.plugin.springsecurity.requestMap.className = 'security.Requestmap'
grails.plugin.springsecurity.securityConfigType = 'Requestmap'
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
'/': ['permitAll'],
'/index': ['permitAll'],
'/index.gsp': ['permitAll'],
'/**/js/**': ['permitAll'],
'/**/css/**': ['permitAll'],
'/**/images/**': ['permitAll'],
'/**/favicon.ico': ['permitAll']
]
最后,我通过执行 grails run-app 命令运行了应用程序,我希望登录页面 (auth.gsp) 现在不再是其中的一部分您的代码,但要返回的插件(按设计)
C\myPathToGrails\.grails\2.2.2\projects\Test\plugins\spring-security-core-2.0-RC2\grails-app\views\login\auth.gsp
但我得到一个空白页面,说明此页面有一个重定向循环。
我还添加了以下静态规则,清理应用程序,然后重新运行它,看看它是否能解决问题,但重定向消息仍然出现。
'/login/**': ['permitAll'],
'/login/auth/**': ['permitAll'],
'/login.gsp': ['permitAll']
有人知道如何解决这个问题吗?
提前致谢。
【问题讨论】:
【参考方案1】:您使用 Requestmap 作为安全配置类型,您的 controllerAnnotations.staticRules 没有任何效果。
您需要在RequestMap表中配置规则,并让您的登录控制器和公共页面匿名访问,无需登录,如:
new Requestmap(url: '/*', configAttribute: 'IS_AUTHENTICATED_ANONYMOUSLY').save();
new Requestmap(url: '/logout/**', configAttribute: 'IS_AUTHENTICATED_REMEMBERED,IS_AUTHENTICATED_FULLY').save();
new Requestmap(url: '/login/**', configAttribute: 'IS_AUTHENTICATED_ANONYMOUSLY').save()
new Requestmap(url: '/index/**', configAttribute: 'IS_AUTHENTICATED_ANONYMOUSLY').save();
【讨论】:
非常感谢您让我开心。这些条目在以前的版本中不必存在。 我有类似的问题。 ***.com/questions/26726867/…。请帮忙 我需要在哪里添加这些行?【参考方案2】:感谢 Ignacio Ocampo 先生的帮助。
这些行必须添加到 bootstrap.groovy 中。
非常感谢。
class BootStrap
def springSecurityService
def grailsApplication
def init = servletContext ->
println "In bootstrap Init"
//Added so that these urls can be visible to everyone
new Requestmap(url: '/*', configAttribute: 'IS_AUTHENTICATED_ANONYMOUSLY').save();
new Requestmap(url: '/logout/**', configAttribute: 'IS_AUTHENTICATED_REMEMBERED,IS_AUTHENTICATED_FULLY').save();
new Requestmap(url: '/login/**', configAttribute: 'IS_AUTHENTICATED_ANONYMOUSLY').save()
new Requestmap(url: '/index/**', configAttribute: 'IS_AUTHENTICATED_ANONYMOUSLY').save();
println 'Bootstrap init done'
def destroy =
【讨论】:
以上是关于由于重定向循环,Grails Spring Security 无法显示登录页面的主要内容,如果未能解决你的问题,请参考以下文章
Grails Spring Security - 登录后总是重定向到特定页面?
如何防止 JA-SIG CAS spring 安全重定向循环?
Grails 和 Spring Security 插件:基于角色登录时重定向用户