Grails Spring安全插件在HttpSession中将currentUser保存在哪里

Grails Spring安全插件在HttpSession中将currentUser保存在哪里,grails,spring-security,httpsession,Grails,Spring Security,Httpsession,通过调用以下命令获取当前用户是很有名的: springSecurityService.currentUser ; Spring Ssecurity API是否将此对象保存在HttpSession中。如果是,请说明如何从会话访问此对象 i、 e:session['currentUser']在HttpSession检查session.getAttributeNames()之后,我想分享我的结果: session.getAttribute('SPRING_SECURITY_CONTEXT').au

通过调用以下命令获取当前用户是很有名的:

springSecurityService.currentUser ; 
Spring Ssecurity API是否将此对象保存在
HttpSession
中。如果是,请说明如何从会话访问此对象


i、 e:
session['currentUser']
在HttpSession检查
session.getAttributeNames()
之后,我想分享我的结果:

session.getAttribute('SPRING_SECURITY_CONTEXT').authentication.principal
没有

正如您在回答中所示,
主体
存储在会话中,但这是由
org.springframework.security.core.userdetails.userdetails
创建的
org.springframework.security.core.userdetails.userdetails服务
实例。插件中的默认实现是
grails.plugin.springsecurity.userdetails.GrailsUser
,但这很容易定制

UserDetails
实例通常是一个轻量级对象,只包含用户名和哈希密码、几个锁定/启用的布尔值,以及一组用于存储角色名称的
GrantedAuthority
实例。我经常建议用户将其扩展到包含有用但在登录会话期间不太可能更改的数据,例如全名,以避免转到数据库检索。由于
UserDetails
存储在会话中,可以通过
springSecurityService.principal
轻松访问,因此它是存储此类数据的好地方

但它与从
getCurrentUser()
/
currentUser
返回的内容不同-这是由
UserDetailsService
加载的GORM用户/个人域类,用于创建
UserDetails
实例。它可以有更多的相关数据,延迟加载有许多集合,等等。它通常是一个相当大的对象,不应该存储在会话中。这样做确实可以方便地获取其数据,但会影响可伸缩性,因为这样会浪费服务器内存并限制服务器可以拥有的并发会话数。而且它是一个断开连接的Hibernate对象,因此要将其用于大多数与持久性相关的操作,您需要重新加载实例,通常使用
merge()
。这将从数据库加载整个内容,因此将所需的额外数据与实例id一起存储在
UserDetails
中会更加高效,这样您就可以根据需要轻松检索实例。这就是
getCurrentUser()
/
currentUser
所做的-如果id可用于
get()
调用,则它使用id,或者使用用户名作为
findByUsername()
调用的等价物(如果用户名具有唯一索引,则成本应大致相同)