Я новичок в Grails. Я настроил основной модуль плагинов безопасности 2.0 RC2. Я могу войти в систему с пользователем, хранящимся в моей базе данных. Я настроил пользовательскую форму входа, и когда я пытаюсь получить доступ к защищенным URL-адресам без входа в систему, я перенаправляюсь в свою собственную форму. Тем не менее, я не смог отображать сообщения об ошибках, когда я использую неверный пароль или несуществующий логин.Grails Spring Security Custom Login Form - Где сообщения об ошибках?
У меня есть следующий фрагмент в моей Grails.config:
grails.plugin.springsecurity.auth.loginFormUrl = '/user/login'
grails.plugin.springsecurity.failureHandler.defaultFailureUrl = '/user/login'
Это похоже на работу. Я успешно добираюсь до своей формы. Я использую LoginController по умолчанию, который поставляется с плагином.
Я попытался все следующие на моей форме:
<g:eachError>
<li><g:message error="${it}"/></li>
</g:eachError>
<g:eachError>
<li>${it}</li>
</g:eachError>
<g:if test="${flash.message}">
<li> class="error">${flash.message}</li>
</g:if>
Никто не показывает каких-либо ошибок. Я вижу, что контроллер входа в систему помещает ошибки во флэш-память:
def authfail() {
String msg = ''
def exception = session[WebAttributes.AUTHENTICATION_EXCEPTION]
if (exception) {
if (exception instanceof AccountExpiredException) {
msg = g.message(code: "springSecurity.errors.login.expired")
}
else if (exception instanceof CredentialsExpiredException) {
msg = g.message(code: "springSecurity.errors.login.passwordExpired")
}
else if (exception instanceof DisabledException) {
msg = g.message(code: "springSecurity.errors.login.disabled")
}
else if (exception instanceof LockedException) {
msg = g.message(code: "springSecurity.errors.login.locked")
}
else {
msg = g.message(code: "springSecurity.errors.login.fail")
}
}
if (springSecurityService.isAjax(request)) {
render([error: msg] as JSON)
}
else {
flash.message = msg
redirect action: 'auth', params: params
}
}
, но они, кажется, исчезли, когда отображается моя страница. Я вижу, что события ошибки поднимаются, поскольку я создал прослушиватель событий безопасности, который регистрирует их. Эксперты Grails и Spring Security, чего мне не хватает?
У меня есть два вопроса. SecurityEventListener - это компонент Spring, а не компонент Grails. Как получить доступ к флэш-объекту из Spring? У меня есть googled, но не повезло найти, как это сделать. Кроме того, плагин Spring Security, похоже, уже делает это, разве Spring Security делает некоторые дополнительные перенаправления, которые выходят за рамки? –
Я понял ответ на вопрос 2. Если вы измените URL-адрес отказа по умолчанию, метод authfail() в LoginController, который добавляет сообщения, никогда не вызывается. Похоже, вам нужно оставить эту настройку немодифицированной, а затем она должна перенаправляться на ваш настроенный URL-адрес входа после обработки authfail(), как и при использовании gsp по умолчанию, но это не так. –
Я только что отредактировал по умолчанию LoginController.groovy, чтобы изменить authfail(), чтобы перенаправить на мою пользовательскую форму, а не по умолчанию. Похоже, что это то, что должно исходить от конфигурации, а не кода, но, возможно, есть конфигурация, которую я не вижу. –