Я пытаюсь получить текущего пользователя внутри контроллера в приложении 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
Также обратите внимание, что если вам это нужно только в контроллере, вы можете пропустить инъекцию 'springSecurityService' и использовать метод метакласса [getAuthenticatedUser()] (https://grails-plugins.github.io/grails-spring-security -core/guide/controllerMetaClassMethods.html), который вводится во все контроллеры (или аналогичное свойство authenticatedUser). –
Спасибо, Берт! Я также добавил обновление с кодом, который я использовал в конце, чтобы получить имя текущего пользователя. –
Это совсем другое. 'springSecurityService.currentUser' извлекает экземпляр класса домена из базы данных и должен использоваться только тогда, когда вам нужны данные класса домена, недоступные из' Authentication'. Если вам нужно только имя пользователя, то ваш код в порядке, а более компактным вариантом является 'springSecurityService.principal.username'. Если вы не можете зависеть от инъекции 'springSecurityService', то что-то сломается. Конечно, предполагается, что вы используете плагин Spring-security-core - если вы используете стартер Spring Boot, то да, вы должны сделать гораздо больше работы в своем приложении. –