【发布时间】:2017-11-14 04:30:24
【问题描述】:
我们有一个使用 Spring Security 的 Grails Web 应用程序和一个包含用户名、电子邮件和全名的用户对象。在很多地方,我们在处理请求时调用 springSecurityService.currentUser - 这目前工作正常并根据用户名返回用户(以前总是一个电子邮件地址,因此是唯一的)
但是,现在需要更改用户名可能不是电子邮件,因此在用户对象中不是唯一的 - 它还必须考虑可选的电子邮件和全名字段。这意味着我们可以有两个名为“bobsmith”的用户,只要他们的电子邮件/全名值不同。
据我所知,springSecurity.currentUser 仅根据用户名在 User 表上进行查找 - 这对我们将不再有效,因为它可能只会检索它找到的第一个匹配的用户名,这可能是错误的。
是否可以配置 Grails/Spring Security 以基于多个字段设置当前用户。我确切地知道我想做什么,这实际上是伪逻辑(我知道这是不可能的):
if (email && !fullname) {
springSecurityService.currentUser = User.findByUsernameAndEmail(username)
} else if (!email && fullname) {
springSecurityService.currentUser = User.findByUsernameAndFullname(username, fullname)
} else if (email && fullname) {
springSecurityService.currentUser = User.findByUsernameAndEmailAndFullname(username, email, fullname)
}
SpringSecurityService getCurrentUser() 是:
def getCurrentUser() {
if (!isLoggedIn()) {
return null
}
def User = getClassForName(securityConfig.userLookup.userDomainClassName)
if (principal instanceof GrailsUser) {
User.get principal.id
}
else {
User.createCriteria().get {
String usernamePropertyName = securityConfig.userLookup.usernamePropertyName
eq usernamePropertyName, principal[usernamePropertyName]
cache true
}
}
}
最后一部分是在我们的案例中执行的:
User.createCriteria().get {
String usernamePropertyName = securityConfig.userLookup.usernamePropertyName
eq usernamePropertyName, principal[usernamePropertyName]
cache true
}
有没有办法以某种方式改变这个功能?我考虑在链中添加一个自定义过滤器,但不确定这是否会根据固定到用户名属性的检索逻辑产生任何影响(我不想更改,因为它当然是正确的)。
非常感谢任何帮助或建议
【问题讨论】: