使用 Grails 3.0.3 将 springSecurityService 注入控制器

Posted

技术标签:

【中文标题】使用 Grails 3.0.3 将 springSecurityService 注入控制器【英文标题】:Injecting springSecurityService into Controller with Grails 3.0.3 【发布时间】:2015-11-10 06:22:54 【问题描述】:

我试图在 Grails 3.0.3 应用程序的控制器中获取当前用户。 我使用this repo 作为我的安全设置的基础——安全性是基于 GORM 的。我在 build.gradle 中使用以下行来包含 Spring Security Framework:

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

但是当我尝试像在我的控制器中的其他 SO 线程中推荐的那样注入 springSecurityService(例如,参见:this one)时,我只得到一个空对象。它没有像应有的那样启动。

class RestapiController 
    def springSecurityService

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

如何将 springSecurityService 注入 Grails 3.0.3 中的控制器?

更新: 最后我使用以下行来获取当前用户:

SecurityContextHolder.context.authentication.name

【问题讨论】:

【参考方案1】:

springSecurityService 不是 Spring Security 的一部分,它在 Grails spring-security-core 插件中。 Spring Security 没有“当前用户”的概念。您可以访问当前的Authentication 并获取用户名、密码、启用等,但框架中没有任何内容可以让您返回用于填充身份验证的源对象(在 Grails + spring-security-core这通常是一个User 域类实例) - 这必须在您的应用程序代码中完成。

这个周末我发布了与 Grails 3 配合使用的插件的初始版本,版本 3.0.0.M1。文档是here。文档中有一个简短的教程可帮助您入门,您还可以查看 this sample app using the plugin in Grails 3。

【讨论】:

另外请注意,如果您只需要在控制器中使用它,您可以跳过注入 springSecurityService 并使用注入所有控制器的 getAuthenticatedUser() metaclass method(或类似的 authenticatedUser 属性)。跨度> 谢谢伯特!我还添加了一个更新,其中包含我最后使用的代码来获取当前用户的名称。 那是非常不同的。 springSecurityService.currentUser 从数据库中检索域类实例,并且只应在您需要无法从 Authentication 获得的域类数据时使用。如果您只需要用户名,那么您的代码就可以了,更紧凑的选项是springSecurityService.principal.username。如果你不能依赖注入springSecurityService,那么有些东西就坏了。当然,这是假设您使用的是 spring-security-core 插件 - 如果您使用的是 Spring Boot 启动器,那么是的,您必须在您的应用程序中做更多的工作。

以上是关于使用 Grails 3.0.3 将 springSecurityService 注入控制器的主要内容,如果未能解决你的问题,请参考以下文章

在 Grails Spring 安全核心插件中配置了两次 Spring 安全核心框架

无法使用 mongodb 插件版本 3.0.3 运行 Grails 应用程序

将 grails 集成到现有的 Spring 应用程序中?

如何在 grails 2.4.4 中使用 mongodb?

使用 spring-security-core 插件将 Facebook 登录 (oauth) 与现有 grails 应用程序集成

使用 Spring Security 和 Grails 注销后如何将用户重定向到不同的页面