#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 уровня выше по цепочке. Поэтому не должно иметь значения, какой класс я расширяю, если он является одним из них.