Создание пользовательского исключения и отображение сообщения об ошибке от Custom AuthenticationProvider - PullRequest
4 голосов
/ 20 июня 2011

Это продолжение до этого вопроса .

У меня есть пользовательский AuthenticationProvider, который расширяет AbstractUserDetailsAuthenticationProvider.В дополнительном AuthenticationChecks я выполняю некоторую пользовательскую аутентификационную работу, и часть этого процесса состоит в отображении некоторых сообщений пользователю на экране входа в систему.В настоящее время для тестирования я создал исключение UserNotActivationException:

class UserNotActivatedException extends AuthenticationException {

  public UserNotActivatedException(String message, Throwable t) {
    super(message, t)
  }

  public UserNotActivatedException(String message) {
    super(message)
  }

  public UserNotActivatedException(String message, Object extraInformation) {
    super(message, extraInformation)
  }

}

И в дополнительных проверках AuthenticationChecks я просто сразу же выбрасываю его для тестирования.Теперь мне нужно знать, что мне нужно сделать, чтобы мое собственное сообщение об ошибке отображалось на экране входа в систему.В конфигурации по умолчанию для ядра Spring-security мы можем переопределить следующее:

errors.login.disabled = "Sorry, your account is disabled."
errors.login.expired = "Sorry, your account has expired."
errors.login.passwordExpired = "Sorry, your password has expired."
errors.login.locked = "Sorry, your account is locked."
errors.login.fail = "Sorry, we were not able to find a user with that username and password."

Но я не вижу, как я могу добавить свои собственные дополнительные сообщения.

1 Ответ

4 голосов
/ 20 июня 2011

Похоже, что эти сообщения просто используются действием authfail LoginController, которое генерируется в grails-app/controllers.Вот код из шаблона (в плагине):

/**
 * Callback after a failed login. Redirects to the auth page with a warning message.
 */
def authfail = {

    def username = session[UsernamePasswordAuthenticationFilter.SPRING_SECURITY_LAST_USERNAME_KEY]
    String msg = ''
    def exception = session[WebAttributes.AUTHENTICATION_EXCEPTION]
    if (exception) {
        if (exception instanceof AccountExpiredException) {
            msg = SpringSecurityUtils.securityConfig.errors.login.expired
        }
        else if (exception instanceof CredentialsExpiredException) {
            msg = SpringSecurityUtils.securityConfig.errors.login.passwordExpired
        }
        else if (exception instanceof DisabledException) {
            msg = SpringSecurityUtils.securityConfig.errors.login.disabled
        }
        else if (exception instanceof LockedException) {
            msg = SpringSecurityUtils.securityConfig.errors.login.locked
        }
        else {
            msg = SpringSecurityUtils.securityConfig.errors.login.fail
        }
    }

    if (springSecurityService.isAjax(request)) {
        render([error: msg] as JSON)
    }
    else {
        flash.message = msg
        redirect action: auth, params: params
    }
}

(из ~ / .grails / 1.3.7 / projects / имя-проекта / плагины / spring-security-core-1.1.2 / src / templates / LoginController.groovy.template)

Возможно, вы просто можете добавить свой тип UserNotActivationException к имеющимся там условиям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...