Grails通道安全导致重定向循环

时间:2016-02-03 16:26:54

标签: grails spring-security https grails-plugin redirect-loop

我是Grails的新手,我正在开发一个现有的应用程序。我试图强迫所有使用我们网站的人都在https上。我添加了Spring Security Core插件

//BuildConfig.groovy
compile "org.grails.plugins:spring-security-core:2.0.0"

我刚刚添加了

///Config.groovy
grails.plugin.springsecurity.secureChannel.definition = [
    '/**': 'REQUIRES_SECURE_CHANNEL'

当我尝试使用localhost:8080 / myapp时,它会将我重定向到https://localhost:8443/myapp,但我得到了一个"此网页有一个重定向循环ERR_TOO_MANY_REDIRECTS"消息。

我在SecurityFilters.groovy中添加了print语句,我可以看到无限循环

baseFilter(controller: "*", action: "*") 
    {
        before = {  
            println "baseFilter"
            // If auth controller then ok to continue
            if (controllerName.equals("auth"))
            {
                return true;
            }

            // If no subject (user) and not auth controller then user must authenticate
            if (!session.subject && !(controllerName.equals("auth")))
            {
              params.targetUri = request.forwardURI - request.contextPath
              if (params.action=="profile") {
                params.targetUri=params.targetUri + "?page=" + params?.page
              }
              else if (params.action=="results") {
                params.targetUri="/home"
              }
              println "baseFilter: Redirecting: PARAMS = $params"
              redirect(controller:'auth', action:'login', params: params)
              return false;
            }
        }
    }

它只是:

baseFilter
baseFilter: Redirecting: PARAMS = [action:auth, format:null,  controller:login, targetUri:/login/auth]

一遍又一遍。

我已尝试过在Stackoverflow和其他网站上发现的许多其他内容,但它们要么不起作用,要么太复杂。

谢谢。

1 个答案:

答案 0 :(得分:0)

好的,所以这不是问题的答案,但我设法实现了我想要做的事情,即强制SLL,并重定向任何使用http的尝试。我是通过使用shiro插件完成的,这个插件已经被我的应用程序使用了。在Buildconfig.groovy中,只需向您的插件添加编译“:shiro:1.2.1”。在config.groovy中,我添加了以下属性:

security { 
    shiro { 
        filter { 
            loginUrl = "/login" 
            successUrl = "/" 
            unauthorizedUrl = "/unauthorized" 
            filterChainDefinitions = """
                                     /** = ssl[443]
                                     """ 
        } 
    } 
}

您可以修改filterChainDefinitions以仅强制某些网址上的ssl。我刚用/ **因为我总是想要SSL。