【问题标题】:Grails Spring Security Override Current User To Lookup on Multiple Fields & Not Just UsernameGrails Spring Security 覆盖当前用户以查找多个字段而不仅仅是用户名
【发布时间】: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
            }

有没有办法以某种方式改变这个功能?我考虑在链中添加一个自定义过滤器,但不确定这是否会根据固定到用户名属性的检索逻辑产生任何影响(我不想更改,因为它当然是正确的)。

非常感谢任何帮助或建议

【问题讨论】:

    标签: grails spring-security


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常感谢您的回复 - 我自己也得出了同样的结论,并意识到我正在尝试使用一些并没有真正起作用的东西,因此确实创建了一种不同的方法来解决问题。在这个过程中学到了很多东西,非常值得。再次感谢
    猜你喜欢
    • 2021-05-22
    • 2014-06-10
    • 1970-01-01
    • 2014-03-17
    • 2014-06-13
    • 2015-12-20
    • 1970-01-01
    • 2023-03-04
    • 2014-04-14
    相关资源
    最近更新 更多