Безопасность канала Grails, вызывающая петлю перенаправления
Я новичок в 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".
Я добавил операторы print в свой 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]
Вновь и вновь.
Я пробовал много других вещей, которые я нашел на Stackru и других сайтах, но они либо не работают, либо слишком сложны.
Спасибо.
1 ответ
Итак, это не ответ на вопрос, но мне удалось добиться того, что я пытался сделать, - заставить SLL и перенаправить любые попытки использовать http. Я сделал это с помощью плагина shiro, который уже использовался моим приложением. В Buildconfig.groovy просто добавьте компиляцию ":shiro:1.2.1" к своим плагинам. В config.groovy я добавил следующие свойства:
security {
shiro {
filter {
loginUrl = "/login"
successUrl = "/"
unauthorizedUrl = "/unauthorized"
filterChainDefinitions = """
/** = ssl[443]
"""
}
}
}
Вы можете изменить свои filterChainDefinitions, чтобы использовать ssl только для определенных URL. Я просто использовал /**, потому что я всегда хочу SSL.