2015-08-17 5 views
2

Я пытаюсь получить текущего пользователя внутри контроллера в приложении Grails 3.0.3. Я использовал this репо в качестве базы для моей настройки безопасности - безопасность основана на GORM. Я использую следующую строку в build.gradle для того, чтобы включить Spring Framework безопасности:Injecting springSecurityService в контроллер с Grails 3.0.3

compile "org.springframework.boot:spring-boot-starter-security" 

, но когда я пытаюсь придать springSecurityService, как это было рекомендовано в других SO потоков (см, например: this one) в мой контроллер, Я получаю только нулевой объект. Он не инициируется, как должно быть.

class RestapiController { 
    def springSecurityService 

    def currentUser(){ 
     def user = springSecurityService.currentUser 
     render user 
    } 
} 

Как я могу вставить SpringSecurityService в контроллер в Grails 3.0.3?

UPDATE: В конце концов я использовал следующую строку для получения текущего пользователя:

SecurityContextHolder.context.authentication.name 

ответ

2
springSecurityService

не является частью Spring Security, это в весенне-безопасности основного плагина Grails. У Spring Security нет понятия «текущий пользователь». Вы можете получить доступ к текущему Authentication и получить имя пользователя, пароль, включено и т. Д., Но в структуре нет ничего, что возвращает вас к исходному объекту, который использовался для заполнения аутентификации (в Grails + spring-security-core это часто экземпляр класса User) - это должно быть сделано в коде приложения.

В эти выходные я выпустил исходную версию плагина, который работает с Grails 3, версия 3.0.0.M1. Документация: here. В документах есть короткий учебник, который поможет вам начать работу, и вы также можете посмотреть this sample app using the plugin in Grails 3.

+0

Также обратите внимание, что если вам это нужно только в контроллере, вы можете пропустить инъекцию 'springSecurityService' и использовать метод метакласса [getAuthenticatedUser()] (https://grails-plugins.github.io/grails-spring-security -core/guide/controllerMetaClassMethods.html), который вводится во все контроллеры (или аналогичное свойство authenticatedUser). –

+0

Спасибо, Берт! Я также добавил обновление с кодом, который я использовал в конце, чтобы получить имя текущего пользователя. –

+1

Это совсем другое. 'springSecurityService.currentUser' извлекает экземпляр класса домена из базы данных и должен использоваться только тогда, когда вам нужны данные класса домена, недоступные из' Authentication'. Если вам нужно только имя пользователя, то ваш код в порядке, а более компактным вариантом является 'springSecurityService.principal.username'. Если вы не можете зависеть от инъекции 'springSecurityService', то что-то сломается. Конечно, предполагается, что вы используете плагин Spring-security-core - если вы используете стартер Spring Boot, то да, вы должны сделать гораздо больше работы в своем приложении. –