Grails:如何获取当前登录用户的用户名,这需要啥导入?
Posted
技术标签:
【中文标题】Grails:如何获取当前登录用户的用户名,这需要啥导入?【英文标题】:Grails: How to get username of currently logged in user, and what imports does that require?Grails:如何获取当前登录用户的用户名,这需要什么导入? 【发布时间】:2015-08-16 11:42:47 【问题描述】:我只需要当前登录用户的名称。与<sec:username/>
在 gsp 中显示的相同。我不知道该怎么做。
这是以前的答案和问题 - 它们似乎都需要一些导入,但没有一个解决方案适合我:
具体来说,我想访问控制器内部的用户名并将其放入域实例的变量中,以便将其(连同其他信息)持久保存到数据库中以进行日志记录。在该控制器内部,没有任何东西可以看到,即使是远程引用 Person/User 类、spring security 或任何其他听起来可能符合我意图的东西。
【问题讨论】:
【参考方案1】:您可以使用springSecurityService.currentUser
访问与登录用户对应的域对象,然后从那里获取用户名(或您需要的任何其他属性)。由于 Groovy 的动态特性,您不需要导入域类或 SpringSecurityService
类来执行此操作,只需使用无类型依赖注入即可
def springSecurityService
您可以访问springSecurityService.currentUser?.username
(或其他)。
尽管正如 Burt 在评论中指出的那样,如果只是您想要的用户名,那么使用 springSecurityService.authentication.principal.username
会更有效,因为这不需要从数据库中加载用户对象。如果您想要除 ID 或用户名之外的用户对象的其他属性,则只需要 currentUser
。
【讨论】:
currentUser
是一种获取用户名的昂贵方式,因为它会从数据库加载 User
实例。 authentication.principal.username
是轻量级的,因为它已经缓存在内存中【参考方案2】:
刚刚想通了:在控制器中,def springSecurityService
紧跟在控制器类的左括号之后(即class YourController
),变量赋值如下所示:def username = springSecurityService.authentication.principal.getUsername()
- 显然是在玩some code posted here帮助了我。
【讨论】:
如果没有人登录,该命令将失败,我现在还预先检查,使用:if (springSecurityService.isLoggedIn())
- 所以总代码是:String currentUser = "" if (springSecurityService.isLoggedIn()) currentUser = springSecurityService.authentication.principal.getUsername()
也很实用 - 如果没有人登录,springSecurityService.authentication.getPrincipal()
返回字符串 anonymousUser
- for more details, see the comment on SpringSecurityService.groovy lines 54 to 56, just before getPrincipal()
以上是关于Grails:如何获取当前登录用户的用户名,这需要啥导入?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Grails 中使用 Spring Security 检查用户在线状态?
使用spring security的Grails Facebook登录-如何知道登录的用户名
Grails 2.1.0 / Java 7 从哪里获取 Windows 8.1 上的当前用户名?