0

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

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

用户信息.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

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

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

为了说明这一点:

class User {

transient springSecurityService

String username
String password
    String firstname
    ...

然后我可以在上述索引方法中引用我的用户的名字属性。

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

提前感谢您的宝贵时间。

4

3 回答 3

2

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

于 2012-10-18T02:48:16.627 回答
0

如果您扩展User该类,则 SpringSecurity 插件对您的扩展类一无所知UserInfo

如果你打电话给springSecurityService.currentUser你,你会得到一个Usernot of UserInfo- 所以你没有属性firstname

如果您不喜欢向其中添加几个新属性,User可以添加对该UserInfo类的引用。

class UserInfo {
    static belongsTo = [user: User]

    String firstname
    String lastname
    ...
}

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

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

于 2012-10-17T06:31:06.517 回答
0

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

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

如果您扩展/更新任何默认值,则此页面中大约有一些与用户和角色/权限相关的属性。

于 2012-10-17T07:11:45.000 回答