我有一个基本的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然而,当我尝试将名字定义为springSecurityService.currentUser.firstname的一部分时,上面的"def index()“方法失败了。
如果我将额外的属性注入到基类User.groovy中,那么我可以通过springSecurityService.currentUser.property的方式引用它们
要说明这一点,请执行以下操作:
class User {
transient springSecurityService
String username
String password
String firstname
...然后,我可以在前面提到的index方法中引用我的用户的firstname属性。
是否可以引用我的User的扩展属性而不在User基类中注入值?我在这里的目标是尽量保持User类的整洁,同时仍然能够调用UserInfo.groovy文件中引用的值。
提前感谢您的宝贵时间。
发布于 2012-10-18 10:48:17
如果您确实需要将用户信息的一些属性放到另一个域中,并且希望仍然可以从springSecurityService.currentUser访问这些属性,那么您必须实现自己的UserDetailsService来将UserInfo属性与User打包。
发布于 2012-10-17 14:31:07
如果扩展User类,SpringSecurity插件将不知道任何有关扩展类UserInfo的信息。
如果你调用springSecurityService.currentUser,你会得到一个User的实例,而不是UserInfo的实例--所以你没有firstname属性。
如果不想向User添加几个新属性,可以添加对UserInfo类的引用。
class UserInfo {
static belongsTo = [user: User]
String firstname
String lastname
...
}
class User {
...
UserInfo userInfo
...
}您应该记住,此引用向您的数据库添加了一个额外的表,如果您想要访问您的用户实例,这将导致额外的联接操作。
https://stackoverflow.com/questions/12926727
复制相似问题