导致重定向循环的 Grails 通道安全性
Grails channel security causing a redirect loop
我是 Grails 的新手,我正在开发一个现有的应用程序。我试图强迫使用我们网站的任何人始终使用 https。我添加了 Spring 安全核心插件
//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,但我收到 "This webpage has a redirect loop ERR_TOO_MANY_REDIRECTS" 消息。
我在我的 SecurityFilters.groovy 中添加了打印语句,我可以看到无限循环在进行
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]
一遍又一遍。
我尝试了很多在 Whosebug 和其他网站上找到的其他东西,但它们要么不起作用,要么太复杂。
谢谢。
好的,所以这不是问题的答案,但我设法实现了我想要做的事情,即强制 SLL,并重定向任何使用 http 的尝试。我通过使用我的应用程序已经使用的 shiro 插件来做到这一点。在 Buildconfig.groovy 中,只需将 compile ":shiro:1.2.1" 添加到你的插件中。在 config.groovy 我添加了以下属性:
security {
shiro {
filter {
loginUrl = "/login"
successUrl = "/"
unauthorizedUrl = "/unauthorized"
filterChainDefinitions = """
/** = ssl[443]
"""
}
}
}
您可以修改您的 filterChainDefinitions 以仅对某些 url 强制使用 ssl。我只是使用 /** 因为我一直想要 SSL。
我是 Grails 的新手,我正在开发一个现有的应用程序。我试图强迫使用我们网站的任何人始终使用 https。我添加了 Spring 安全核心插件
//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,但我收到 "This webpage has a redirect loop ERR_TOO_MANY_REDIRECTS" 消息。
我在我的 SecurityFilters.groovy 中添加了打印语句,我可以看到无限循环在进行
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]
一遍又一遍。
我尝试了很多在 Whosebug 和其他网站上找到的其他东西,但它们要么不起作用,要么太复杂。
谢谢。
好的,所以这不是问题的答案,但我设法实现了我想要做的事情,即强制 SLL,并重定向任何使用 http 的尝试。我通过使用我的应用程序已经使用的 shiro 插件来做到这一点。在 Buildconfig.groovy 中,只需将 compile ":shiro:1.2.1" 添加到你的插件中。在 config.groovy 我添加了以下属性:
security {
shiro {
filter {
loginUrl = "/login"
successUrl = "/"
unauthorizedUrl = "/unauthorized"
filterChainDefinitions = """
/** = ssl[443]
"""
}
}
}
您可以修改您的 filterChainDefinitions 以仅对某些 url 强制使用 ssl。我只是使用 /** 因为我一直想要 SSL。