Где плагин 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
Другие вопросы по тегам