首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Grails SpringSecurity用户对象

Grails SpringSecurity用户对象
EN

Stack Overflow用户
提问于 2012-10-17 11:35:41
回答 2查看 803关注 0票数 0

我有一个基本的Grails 2应用程序,它是我和SpringSecurityCore插件一起安装的。这似乎运行得很好。但是,当我尝试通过扩展类的方式向User.groovy文件添加其他属性时,似乎无法在控制器中引用这些属性。

为了更好地说明这个问题,请看一下我的扩展User.groovy的基本类:

UserInfo.groovy:

代码语言:javascript
复制
class UserInfo extends User {

String firstname
String lastname
}

在我想要引用当前用户名字的页面上,我只是简单地编写了如下方法:

代码语言:javascript
复制
def index() { 


        def uname = springSecurityService.currentUser.username
        def firstname = springSecurityService.currentUser.firstname

        render uname

    }

这可以很好地呈现用户名,我相信这是因为在基本User.groovy文件中引用了用户名:

代码语言:javascript
复制
class User {

transient springSecurityService

String username
String password

然而,当我尝试将名字定义为springSecurityService.currentUser.firstname的一部分时,上面的"def index()“方法失败了。

如果我将额外的属性注入到基类User.groovy中,那么我可以通过springSecurityService.currentUser.property的方式引用它们

要说明这一点,请执行以下操作:

代码语言:javascript
复制
class User {

transient springSecurityService

String username
String password
    String firstname
    ...

然后,我可以在前面提到的index方法中引用我的用户的firstname属性。

是否可以引用我的User的扩展属性而不在User基类中注入值?我在这里的目标是尽量保持User类的整洁,同时仍然能够调用UserInfo.groovy文件中引用的值。

提前感谢您的宝贵时间。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-18 10:48:17

如果您确实需要将用户信息的一些属性放到另一个域中,并且希望仍然可以从springSecurityService.currentUser访问这些属性,那么您必须实现自己的UserDetailsService来将UserInfo属性与User打包。

票数 2
EN

Stack Overflow用户

发布于 2012-10-17 14:31:07

如果扩展User类,SpringSecurity插件将不知道任何有关扩展类UserInfo的信息。

如果你调用springSecurityService.currentUser,你会得到一个User的实例,而不是UserInfo的实例--所以你没有firstname属性。

如果不想向User添加几个新属性,可以添加对UserInfo类的引用。

代码语言:javascript
复制
class UserInfo {
    static belongsTo = [user: User]

    String firstname
    String lastname
    ...
}

class User {
   ...
   UserInfo userInfo
   ... 
}

您应该记住,此引用向您的数据库添加了一个额外的表,如果您想要访问您的用户实例,这将导致额外的联接操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12926727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档