Grails Spring安全性(获取当前用户)

Grails Spring安全性(获取当前用户),grails,spring-security,Grails,Spring Security,是否有理由: def user = User.get(springSecurityService.principal.id) 结束 我所能想到的就是防止惰性初始化或确保您当前操作的数据不过时?好吧,两者之间有一点区别。报告指出了这一点 currentUser将始终返回当前登录用户的域实例 principal另一方面,检索当前登录用户的principal。如果经过身份验证,主体将是一个grails.plugin.springsecurity.userdetails.GrailsUser,除非您创

是否有理由:

def user = User.get(springSecurityService.principal.id)
结束


我所能想到的就是防止惰性初始化或确保您当前操作的数据不过时?

好吧,两者之间有一点区别。报告指出了这一点

currentUser
将始终返回当前登录用户的域实例

principal
另一方面,检索当前登录用户的
principal
。如果经过身份验证,主体将是一个
grails.plugin.springsecurity.userdetails.GrailsUser
,除非您创建了一个自定义
userdetails服务
,在这种情况下,它将是您在那里使用的
userdetails
的任何实现

如果未经身份验证且
匿名身份验证筛选器
处于活动状态(默认为true),则使用标准的
org.springframework.security.core.userdetails.User


希望这有助于澄清问题。

实际上,我看不出这两者有什么区别。我倾向于使用

def user = springSecurityService.currentUser

因为它比另一个表单略短,这是插件文档推荐的,并且插件中可能有一些额外的用户缓存(Hibernate已经提供的缓存除外)。

我们刚刚遇到了一个例子,代码正在使用currentUser,但由于用户域没有用户记录而失败。在我们的例子中,principal.username起作用是因为我们有一个自定义UserDetails服务,如果用户表中不存在GrailUser,它会动态创建GrailUser


所以区别很重要。

当然重要,但这是问题的另一个角度;是否需要像第一行那样显式地加载用户,而不仅仅是通过spring服务进行检索。同样的事情?在域类的情况下,这是同样的事情。我不明白这怎么可能是真的“currentUser将始终返回当前登录用户的域实例”,因为
用户
域类可能不存在,也就是说,如果您有文档中的
UserDetailsService
的自定义实现:getCurrentUser()检索当前已验证用户的域类实例。在身份验证期间,将加载用户/个人域类实例以获取用户的密码、角色等,并保存实例的id。这个方法使用id和域类来重新加载实例,但显然这只是在讨论用户域类的情况。如果没有用户域类,那么显然此方法无法返回它的实例。自提交时起,方法
getCurrentuser()
已被弃用。参见Joshua下面的回答,了解上面链接的提交作为替代的
getPrincipal()
。@Donal:SpringSecurity版本2.x和3.x的用法有很大不同。在2.x版中,
SpringSecurityService.getCurrentUser()
可用,并将在3.x版中被弃用。方法
getCurrentUser
不再被标记为弃用。已从中删除已弃用的
@批注<代码>getCurrentUser
在中介绍。
def user = springSecurityService.currentUser