由于重定向循环,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 - 登录后总是重定向到特定页面?

Spring Security grails 登录重定向

如何防止 JA-SIG CAS spring 安全重定向循环?

Grails 和 Spring Security 插件:基于角色登录时重定向用户

会话超时后重定向(Grails、Spring Security Core、Tomcat)

使用 Spring Security 在 Grails App 中避免登录重定向