2012-10-17 99 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了一把,涉及到用戶和角色/機構,您可能需要,如果你更新擴展/更新任何默認值。