2012-10-17 101 views
0

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

为了更好地说明这个问题,请看看我的基本类,它扩展了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 

    } 

这工作正常进行渲染的用户名,而我认为,这是因为用户名参照的文CED在基座User.groovy文件:

class User { 

transient springSecurityService 

String username 
String password 

然而,上述“DEF指数()”当我尝试定义姓名作为springSecurityService.currentUser.firstname的一部分方法失败。 。

如果我注入额外的属性到基User.groovy类的话,我可以通过springSecurityService.currentUser的方式引用它们[属性]

为了说明这一点:

class User { 

transient springSecurityService 

String username 
String password 
    String firstname 
    ... 

我再能够在前面提到的索引方法中引用我的用户的firstname属性。

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

预先感谢您的时间。

回答

2

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

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 
    ... 
} 

你应该记住,这个基准增加了一个额外的表到您的数据库,这会导致额外的连接操作。

0

当您最初安装Spring Security插件并创建了您的User类时,它应该在Config.groovy中添加一些属性,告诉它将哪个类用作默认用户类。扩展默认用户类时,应更新Config.groovy中的属性以反映此情况。你正在寻找的属性更新(或添加如果它不存在)如下:

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

有关于properties in this page了一把,涉及到用户和角色/机构,您可能需要,如果你更新扩展/更新任何默认值。