Расширение AjaxAwareAuthenticationSuccessHandler, запоминание целевого URL

#grails #spring-security

#grails #spring-безопасность

Вопрос:

Grails 1.3.7 Spring-Security-Core 1.1.2

Я внедрил пользовательский класс, который расширяет AjaxAwareAuthenticationSuccessHandler, так что определенные роли могут быть перенесены на определенные URL-адреса после входа в систему, что отлично работает. Однако, если сеанс истекает, мне нужно иметь возможность перенаправить пользователя на запрошенный URL-адрес по истечении срока действия сеанса, переопределив URL-адрес на основе ролей.

Вот упрощенная версия моего кода

 class MyAuthSuccessHandler extends AjaxAwareAuthenticationSuccessHandler {

  @Override
  public void onAuthenticationSuccess(final HttpServletRequest request, final HttpServletResponse response,
                                      final Authentication authentication) throws ServletException, IOException {

    def goAdmin = false
    authentication.authorities.each { ga ->
      if (ga.authority.equals('ROLE_ADMIN')) {
        goAdmin = true
      }
    }

    if (goAdmin) {
      response.sendRedirect(request.contextPath   '/admin/index')
    }else{
      super.onAuthenticationSuccess(request, response, authentication)
    }
  }
}
 

Я попытался добавить вызов determineTargetUrl(запрос, ответ), но он всегда возвращает ‘/’, даже если я запросил ресурс, такой как /admin/foo, который защищен.

Спасибо.

Ответ №1:

Запрашивающий

 super.determineTargetUrl(request, response);
 

должно сработать, если вы используете SavedRequestAwareAuthenticationSuccessHandler его как суперкласс. Я не уверен, возможно ли вам переключиться на этот класс в вашем сценарии. Может быть, это может помочь, но я думаю, вы полностью осознаете это: http://omarello.com/2011/09/grails-custom-target-urls-after-login /

Комментарии:

1. И все же это не так. SavedRequestAwareAuthenticationSuccessHandler — это суперкласс AjaxAware….. Этот метод фактически скрыт в абстрактном суперклассе, который в любом случае находится примерно на 4 уровня выше по цепочке. Поэтому не должно иметь значения, какой класс я расширяю, если он является одним из них.