Grails和Spring Security:如何从控制器中获取经过身份验证的用户?

Mik*_*ler 12 grails

我最近从JSecurity插件迁移到了Spring Security.如何从我的控制器中获取经过身份验证的用户?

Ted*_*eid 15

它目前尚未记录,但在插件安装文件中,它为每个控制器添加了3种方法,因此您实际上不必注入authenticationService:

private void addControllerMethods(MetaClass mc) {
    mc.getAuthUserDomain = {
        def principal = SCH.context?.authentication?.principal
        if (principal != null && principal != 'anonymousUser') {
            return principal?.domainClass
        }

        return null
    }

    mc.getPrincipalInfo = {
        return SCH.context?.authentication?.principal
    }

    mc.isUserLogon = {
        def principal = SCH.context?.authentication?.principal
        return principal != null && principal != 'anonymousUser'
    }
}
Run Code Online (Sandbox Code Playgroud)

这意味着你可以打电话

principalInfo
Run Code Online (Sandbox Code Playgroud)

获得主要对象.它还具有"isUserLogin"以查看用户是否已记录,并且"authUserDomain"用于获取与登录用户的主体关联的实际域类实例(Person/User).

  • 现在方法getPrincipalInfo被称为getAuthenticateduser,但感谢您的好建议! (4认同)

Chr*_*ris 13

以下代码来自Spring Security Core Plugin(版本:1.1.2) - 参考文档 - 第6.2节

grails.plugins.springsecurity.SpringSecurityService提供安全实用程序功能.它是一个常规的Grails服务,因此您使用依赖注入将其注入控制器,服务,taglib等:

class SomeController {
    def springSecurityService
    def someAction = { 
        def user = springSecurityService.currentUser 
        …
    } 
}
Run Code Online (Sandbox Code Playgroud)


Joh*_*ner 10

我正在使用0.5.1,以下内容适用于我:

class EventController {
  def authenticateService

  def list = { 
     def user = authenticateService.principal() 
     def username = user?.getUsername()
     .....
     .....
  } 
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,新版本的Spring Security已经发生了一些变化.[请参阅此处,例如Spring Security版本1.1.2的代码](http://stackoverflow.com/questions/775053/grails-and-spring-security-how-do-i-get-the-authenticated-user-from -within-A-CON/6270545#6270545) (3认同)

che*_*der 5

如今,我认为这样做的方法是:

def user = getAuthenticatedUser()
Run Code Online (Sandbox Code Playgroud)