2013-12-08 4 views
3

Я новичок в 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, чего мне не хватает?

ответ

1

Я бы рекомендовал использовать flash.error, который поместит ваше сообщение об ошибке в область флэш-памяти. Что-то вроде этого:

if (exception instanceof AccountExpiredException) { 
     flash.error = g.message(code: "springSecurity.errors.login.expired") 
} 

Затем в GSP вам потребуется следующее:

<g:if test="${flash.error}"> 
<div class="errors"> 
    <ul><li>${flash.error}</li></ul> 
</div> 

+0

У меня есть два вопроса. SecurityEventListener - это компонент Spring, а не компонент Grails. Как получить доступ к флэш-объекту из Spring? У меня есть googled, но не повезло найти, как это сделать. Кроме того, плагин Spring Security, похоже, уже делает это, разве Spring Security делает некоторые дополнительные перенаправления, которые выходят за рамки? –

+0

Я понял ответ на вопрос 2. Если вы измените URL-адрес отказа по умолчанию, метод authfail() в LoginController, который добавляет сообщения, никогда не вызывается. Похоже, вам нужно оставить эту настройку немодифицированной, а затем она должна перенаправляться на ваш настроенный URL-адрес входа после обработки authfail(), как и при использовании gsp по умолчанию, но это не так. –

+0

Я только что отредактировал по умолчанию LoginController.groovy, чтобы изменить authfail(), чтобы перенаправить на мою пользовательскую форму, а не по умолчанию. Похоже, что это то, что должно исходить от конфигурации, а не кода, но, возможно, есть конфигурация, которую я не вижу. –

Смежные вопросы