Grails и Spring Security: как получить аутентифицированного пользователя из контроллера?

Недавно я перешел с плагина JSecurity на Spring Security. Как мне получить аутентифицированного пользователя из моих контроллеров?


person Mike Sickler    schedule 21.04.2009    source источник


Ответы (6)


Я использую 0.5.1, и у меня работает следующее:

class EventController {
  def authenticateService

  def list = { 
     def user = authenticateService.principal() 
     def username = user?.getUsername()
     .....
     .....
  } 
}
person John Wagenleitner    schedule 22.04.2009
comment
Большое спасибо! Просто опечатка в приведенном выше коде. Должно быть def username = user?.getUsername() - person Mike Sickler; 22.04.2009
comment
Обратите внимание, что в новой версии Spring Security произошли некоторые изменения. См. здесь пример кода для Spring Security версии 1.1.2 - person Chris; 07.06.2011
comment
также обратите внимание, что если вы используете сервис, то инициализация должна быть не в теле метода, а в классе. - person changtung; 29.10.2014

В настоящее время это не задокументировано, но в установочном файле плагина есть 3 метода, которые он добавляет к каждому контроллеру, поэтому вам фактически не нужно вводить службу аутентификации:

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'
    }
}

Это означает, что вы можете просто позвонить

principalInfo

Чтобы получить главный объект. У него также есть «isUserLogin», чтобы увидеть, зарегистрирован ли пользователь, и «authUserDomain», чтобы получить фактический экземпляр класса домена (Person/User), связанный с принципалом вошедшего в систему пользователя.

person Ted Naleid    schedule 22.04.2009
comment
Я полтора часа бился головой о клавиатуру, пытаясь заставить плагин Acegi работать с шаблоном загрузки файлов, показанным в packtpub.com/article/file-sharing-in-grails, пока не нашел это. Спасибо! - person Visionary Software Solutions; 16.11.2009
comment
Теперь метод getPrincipalInfo называется getAuthenticateduser, но спасибо за хороший совет! - person lucke84; 14.01.2013
comment
@lucke84 Похоже, вы правы: grails-plugins .github.io/grails-spring-security-core/guide/ — кажется, все методы изменили названия в современных версиях этого плагина. - person Ian; 06.08.2014

Следующий код взят из модуля Spring Security Core (версия: 1.1.2) - Справочная документация — раздел 6.2

Grails.plugins.springsecurity.SpringSecurityService предоставляет служебные функции безопасности. Это обычная служба Grails, поэтому вы используете внедрение зависимостей, чтобы внедрить ее в контроллер, службу, taglib и т. д.:

class SomeController {
    def springSecurityService
    def someAction = { 
        def user = springSecurityService.currentUser 
        …
    } 
}
person Chris    schedule 07.06.2011

В настоящее время я думаю, что способ сделать это:

def user = getAuthenticatedUser()
person chelder    schedule 21.05.2013

Вы также можете получить текущего пользователя таким образом

 class AnyController {
  def springSecurityService
  def someAction = { 
    def user = User.get(springSecurityService.principal.id)

     } 
 }
person Free-Minded    schedule 08.07.2013

Используйте этот код:

if (springSecurityService.isLoggedIn()){   
        println "Logged In"

    }
person Varaj Vignesh    schedule 11.07.2016