Где плагин Grails Spring Security сохраняет currentUser в HttpSession
Известно получить текущего пользователя, позвонив:
springSecurityService.currentUser ;
Сохраняет ли Spring Ssecurity API этот объект в HttpSession
, если да, то как получить доступ к этому объекту из сеанса.
то есть: session['currentUser']
2 ответа
Это не так.
Как вы показали в своем ответе Principal
хранится в сеансе, но это org.springframework.security.core.userdetails.UserDetails
Экземпляр, который был создан org.springframework.security.core.userdetails.UserDetailsService
, Реализация по умолчанию этого в плагине grails.plugin.springsecurity.userdetails.GrailsUser
но это легко настроить.
UserDetails
Экземпляр, как правило, представляет собой легкий объект, содержащий только имя пользователя и хешированный пароль, несколько заблокированных / включенных логических значений и коллекцию GrantedAuthority
экземпляры для хранения имен ролей. Я часто рекомендую пользователям расширять это, чтобы также содержать данные, которые полезны, но вряд ли изменятся во время сеанса входа в систему, например полное имя, чтобы избежать обращения к базе данных для ее получения. Так как UserDetails
хранится в сеансе и легко доступен через springSecurityService.principal
Это отличное место для хранения таких данных.
Но это не то же самое, что возвращается из getCurrentUser()
/currentUser
- это класс домена пользователя / пользователя GORM, который был загружен UserDetailsService
создать UserDetails
пример. Он может иметь гораздо больше данных, связанных с ним, лениво загруженные коллекции hasMany и т. Д. Это часто довольно большой объект, который не должен храниться в сеансе. Это делает его данные легко доступными, но влияет на масштабируемость, поскольку вы тратите впустую память сервера и ограничивает число одновременных сеансов, которые может иметь сервер. И это отключенный объект Hibernate, поэтому для его использования для большинства действий, связанных с постоянством, необходимо в любом случае перезагрузить экземпляр, часто с merge()
, Это загружает все из базы данных, поэтому гораздо эффективнее хранить дополнительные данные, которые вам нужны, в UserDetails
вместе с идентификатором экземпляра, чтобы вы могли легко получить экземпляр по мере необходимости. Это то что getCurrentUser()
/currentUser
делает - он использует идентификатор, если он доступен для get()
вызов или имя пользователя для эквивалента findByUsername()
вызов (который должен быть примерно такой же стоимости, если имя пользователя имеет уникальный индекс).
После проверки HttpSession session.getAttributeNames()
Хочу поделиться своим результатом:
session.getAttribute('SPRING_SECURITY_CONTEXT').authentication.principal