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 是一个通用的帮助方法,你永远不得不使用它(插件本身不使用它) - 它只是为了你的方便。如果它在您的应用程序中不起作用,请不要使用它 - 只需使用您的自定义逻辑创建您自己的实用程序方法。

如果您的身份验证逻辑比使用usernamepassword 属性更复杂,您可以register a custom UserDetailsService 并在那里使用您的逻辑。

请注意,“当前用户”的概念和身份验证期间使用的逻辑通常密切相关,但并非所有情况都如此,因此您可以根据需要进行这些更改中的一个或两个。

【讨论】:

非常感谢您的回复 - 我自己也得出了同样的结论,并意识到我正在尝试使用一些并没有真正起作用的东西,因此确实创建了一种不同的方法来解决问题。在这个过程中学到了很多东西,非常值得。再次感谢

以上是关于Grails Spring Security 覆盖当前用户以查找多个字段而不仅仅是用户名的主要内容,如果未能解决你的问题,请参考以下文章

Grails Spring Security 覆盖当前用户以查找多个字段而不仅仅是用户名

Grails/Spring Security:无法使用新创建的用户登录

Spring Security UI 和 grails 2.0

Grails Spring Security:如何允许密码为空?

grails spring security ui登录有时会出现奇怪的重定向

Grails - 卸载 Spring Security Core