Grails Spring安全用户对象

时间:2012-10-17 03:35:41

标签: grails groovy spring-security

我有一个基本的Grails 2应用程序,我与SpringSecurityCore插件一起设置。这似乎工作正常。但是,当我尝试通过扩展类向User.groovy文件添加其他属性时,我似乎无法在控制器中引用这些属性。

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

UserInfo.groovy:

class UserInfo extends User {

String firstname
String lastname
}

在我要引用当前用户名字的页面上,我只是按如下方式编写方法:

def index() { 


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

        render uname

    }

这适用于呈现用户名,我相信这是因为在User.groovy文件中引用了用户名:

class User {

transient springSecurityService

String username
String password

但是,当我尝试将firstname定义为springSecurityService.currentUser.firstname的一部分时,上述“def index()”方法失败。

如果我将额外的属性注入基础User.groovy类,那么我可以通过springSecurityService.currentUser引用它们。[property]

为了说明这一点:

class User {

transient springSecurityService

String username
String password
    String firstname
    ...

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

是否可以在不在基本User类中注入值的情况下引用用户的扩展属性?我的目标是尽可能保持User类尽可能干净,同时仍然可以调用UserInfo.groovy文件中引用的值。

提前感谢您的时间。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

如果扩展User类,SpringSecurity插件对扩展类UserInfo一无所知。

如果您致电springSecurityService.currentUser,则会得到User而不是UserInfo的实例 - 因此您没有该属性firstname

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

class UserInfo {
    static belongsTo = [user: User]

    String firstname
    String lastname
    ...
}

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

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

答案 2 :(得分:0)

当您最初安装Spring Security插件并创建User类时,它应该在Config.groovy中添加一些属性,告诉它使用哪个类作为默认用户类。扩展默认User类时,您应该更新Config.groovy中的属性以反映这一点。您要更新的属性(或者如果不存在则添加)如下:

grails.plugins.springsecurity.userLookup.userDomainClassName = 'your.package.UserInfo'

如果您扩展/更新任何默认值,您可能需要更新与用户和角色/权限相关的少数properties in this page