Grails Spring Security: вход в систему с целевым URL пропускает рабочий процесс после аутентификации
В моем приложении Grails я настроил рабочий процесс авторизации постов, написав собственный обработчик успеха аутентификации (в resources.groovy), как показано ниже.
authenticationSuccessHandler (MyAuthSuccessHandler) {
def conf = SpringSecurityUtils.securityConfig
requestCache = ref('requestCache')
defaultTargetUrl = conf.successHandler.defaultTargetUrl
alwaysUseDefaultTargetUrl = conf.successHandler.alwaysUseDefault
targetUrlParameter = conf.successHandler.targetUrlParameter
useReferer = conf.successHandler.useReferer
redirectStrategy = ref('redirectStrategy')
superAdminUrl = "/admin/processSuperAdminLogin"
adminUrl = "/admin/processAdminLogin"
userUrl = "/admin/processUserLogin"
}
Как вы можете из последних трех строк в закрытии выше, в зависимости от роли, предоставленной для входа в систему пользователя, я перенаправляю ее на отдельные действия внутриAdminController где пользовательский UserSessionBean создается и сохраняется в сеансе.
Он отлично работает для обычного случая входа в систему, который в моем приложении выглядит так:
Пользователь приходит в приложение черезhttp://localhost:8080/my-app/
ИЛИ ЖЕhttp://localhost:8080/my-app/login/auth
Она вводит свой действительный логин и пароль и продолжает.Приложение имеет внутренний доступ к MyAuthSuccessHandler, который перенаправляет на AdminController с учетом роли, предоставленной этому пользователю.UserSessionBean создается и сохраняется в сеансеПользователь попал на главную страницу приложенияЯ также написал обычайMyUserDetailsService
расширяяGormUserDetailsService
который правильно доступен в вышеуказанном потоке.
СЦЕНАРИЙ ПРОБЛЕМЫ:
Рассмотрим пользователя, непосредственно обращающегося к защищенному ресурсу (в этом случае контроллер защищен@Secured
аннотации) в приложении.
http://localhost:8080/my-app/inbox/index
Приложение перенаправляет ее наhttp://localhost:8080/my-app/login/auth
Пользователь вводит свой действительный логин и парольПользователь принят вhttp://localhost:8080/my-app/inbox/index
MyAuthSuccessHandler
полностью пропущен в этом процессе и, следовательно, мойUserSessionBean не создается, что приводит к ошибкам при дальнейшем использовании в местах, гдеUserSessionBean Доступ
ВОПРОСОВ:
В случае проблемы приложение пропускаетMyAuthSuccessHandler
потому что есть целевой URL для перенаправления при входе в систему?Можем ли мы заставить процесс всегда проходить черезMyAuthSuccessHandler
даже с целевым URL присутствует?Если ответ на 2 нет, есть ли альтернатива относительно того, как и гдеUserSessionBean все еще можно создать?