我使用spring-security-core并希望使用创建它的用户的id标记新创建的对象。 我尝试使用以下代码,但即使我从getUserID返回一个常量,数据库中的值也始终为零。但是,DateCreated的默认设置有效。
class test {
def springSecurityService
Date dateCreated
int createdBy
static mapping = {
dateCreated column: "dateCreated", defaultValue: newDate()
createdBy column: "createdBy", defaultValue: getUserID()
}
def getUserID() {
def user = springSecurityService.isLoggedIn() ?
springSecurityService.loadCurrentUser() :
null
return user.id
}
}
答案 0 :(得分:1)
当我在DB中更新另一个字段dateCreated时,我在静态映射中设置值时,我无法解释为什么在数据库中createdBy的值为零。
但是我通过在" beforeInsert"中设置createdBy的值来解决我的问题。程序。 所以这是我的解决方案:
class Test
Date dateCreated
int createdBy
def beforeInsert() {
createdBy = getUserID()
}
def int getUserID() {
def user = springSecurityService.isLoggedIn() ?
springSecurityService.loadCurrentUser() :
null
return user ? user.id: -1
}
static mapping = {
dateCreated column: "dateCreated", defaultValue: newDate()
}
}
答案 1 :(得分:0)
首先,字段“createdBy”应该显示哪个用户创建了这个对象,因此它存储在对象中。然后函数“getUserID”正在获取此ID。我尝试了很多不同的东西,这个解决方案就是有效的。正如已经说过的,我不知道为什么这不能
好的,但是你要存储一个int,它有一个进程来获取userId的长数并将其存储为整数值。
现在反过来每次你需要找到实际用户时你需要获得该id并执行User.get(createdBy)
绑定到真正的User类
而不是
int createdBy
尝试
User createdBy
I don't know what you mean with "bind to actual user"
这意味着您将createdBy id绑定为域类中的真实对象,因此在查找时您已经拥有了用户对象,而无需对每个整数执行User.get。每个列表的大量数据库查找等与拥有真实对象相比,在数据库设计/上下文中没有真正的区别,它只是一个真实的对象与平面数字。
非常重要的一点
其次,我在每个域类中注入服务以自动设置用户的观点是非常昂贵的,真的没有必要。整个添加过程应该通过服务完成,在该调用中您只需执行userService.currentUser
听起来你在获取用户方面遇到了问题? class UserService {
def getCurrentUser() {
def principal = springSecurityService?.principal
String username = principal?.username
if (username) {
return find(username)
}
}
def find(String user) {
return User.findByUsername(user)
}
}
所以现在userService.currentUser
将为您提供Spring安全性的实际用户对象
就dateCreated和lastUpdated而言,它们都是grails中的动态字段,不需要任何其他内容。默认情况下,只需要域类中的一个条目即可。它将自动设置这些值
希望你更清楚一点?