是否存在以下情况:
def user = User.get(springSecurityService.principal.id)
在
def user = springSecurityService.currentUser
我能想到的是阻止懒惰或确保您当前正在操作的数据不是陈旧的?
答案 0 :(得分:16)
实际上,我认为这两者之间并没有多大区别。我倾向于使用
def user = springSecurityService.currentUser
因为它比另一种形式略短,这是插件文档推荐的内容,并且可能是插件中用户的一些额外缓存(超出Hibernate已经提供的缓存)。
方法SpringSecurityService.getCurrentUser()
is now deprecated并根据javadoc评论
将在未来版本中删除,无需替换,但有关于如何在应用程序中添加此功能的文档
就我个人而言,我认为在不提供应该替换使用内容的指导的情况下标记弃用方法是不合理的,因此在上述文档可用之前,我倾向于继续使用它。
答案 1 :(得分:7)
嗯,两者之间略有不同。 documentation指出了这一点。
currentUser
将始终返回当前登录用户的域实例。
principal
检索当前登录用户的Principal
。如果经过身份验证,则主体将为grails.plugin.springsecurity.userdetails.GrailsUser
,除非您已创建自定义UserDetailsService
,在这种情况下,它将是您在那里使用的UserDetails
的任何实现。
如果未经过身份验证且AnonymousAuthenticationFilter
处于活动状态(默认情况下为true),则会使用标准org.springframework.security.core.userdetails.User
。
希望有助于澄清事情。
答案 2 :(得分:2)
我们刚遇到一个代码使用currentUser并失败的情况,因为User域没有用户记录。在我们的例子中,principal.username有效,因为我们有一个自定义的UserDetailsService,如果User表中没有一个GrailsUser,它就会动态创建。
所以区别很重要。