Grails Spring Security 覆盖当前用户以查找多个字段而不仅仅是用户名
Posted
技术标签:
【中文标题】Grails Spring Security 覆盖当前用户以查找多个字段而不仅仅是用户名【英文标题】:Grails Spring Security Override Current User To Lookup on Multiple Fields & Not Just Username 【发布时间】: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
有没有办法以某种方式改变这个功能?我考虑在链中添加一个自定义过滤器,但不确定这是否会根据固定到用户名属性的检索逻辑产生任何影响(我不想更改,因为它当然是正确的)。
非常感谢任何帮助或建议
【问题讨论】:
【参考方案1】:getCurrentUser
是一个通用的帮助方法,你永远不得不使用它(插件本身不使用它) - 它只是为了你的方便。如果它在您的应用程序中不起作用,请不要使用它 - 只需使用您的自定义逻辑创建您自己的实用程序方法。
如果您的身份验证逻辑比使用username
和password
属性更复杂,您可以register a custom UserDetailsService 并在那里使用您的逻辑。
请注意,“当前用户”的概念和身份验证期间使用的逻辑通常密切相关,但并非所有情况都如此,因此您可以根据需要进行这些更改中的一个或两个。
【讨论】:
非常感谢您的回复 - 我自己也得出了同样的结论,并意识到我正在尝试使用一些并没有真正起作用的东西,因此确实创建了一种不同的方法来解决问题。在这个过程中学到了很多东西,非常值得。再次感谢以上是关于Grails Spring Security 覆盖当前用户以查找多个字段而不仅仅是用户名的主要内容,如果未能解决你的问题,请参考以下文章
Grails Spring Security 覆盖当前用户以查找多个字段而不仅仅是用户名
Grails/Spring Security:无法使用新创建的用户登录
Spring Security UI 和 grails 2.0
Grails Spring Security:如何允许密码为空?