Grails - ShiroSecurity - 手动登录用户

Posted

技术标签:

【中文标题】Grails - ShiroSecurity - 手动登录用户【英文标题】:Grails - ShiroSecurity - manually login user 【发布时间】:2011-11-02 10:10:59 【问题描述】:

我正在尝试做相对简单的事情:手动登录用户。我正在使用 FacebookGraph 插件连接到 Facebook。如果用户通过 Facebook 登录,我会得到他的 ID,并且我想在 ShiroSecurity 中对他进行身份验证。当然像

这样微不足道的事情
session.user = user

不起作用。 我在 wiki 中找到了代码,应该可以解决问题:

Object userIdentity = user.email
String realmName = "username";
PrincipalCollection principals = new SimplePrincipalCollection(userIdentity, realmName);
Subject subject = new Subject.Builder().principals(principals).buildSubject();

但是它不起作用。我仍然被重定向到 auth/login 并显示 ShiroSubject 为空的 log.debug 消息。也许是因为我在服务中调用了这段代码。 任何想法如何使这项工作?

更新:

 def authenticate(authToken) 
    log.info "Attempting to authenticate $authToken.username in DB realm..."+authToken.encodeAsJSON()
    def username = authToken.username

    // Null username is invalid
    if (username == null) 
        throw new AccountException("Null usernames are not allowed by this realm.")
    

    // Get the user with the given username. If the user is not
    // found, then they don't have an account and we throw an
    // exception.
    log.debug "reached this point2"
    def user = ShiroUser.findByUsername(username)
    log.debug "reached this point"
    if (!user) 
        throw new UnknownAccountException("No account found for user [$username]")
    

    log.info "Found user '$user.username' in DB"

    // Now check the user's password against the hashed value stored
    // in the database.
    def account = new SimpleAccount(username, user.passwordHash, "ShiroDbRealm")
    if (!credentialMatcher.doCredentialsMatch(authToken, account)) 
        log.info "Invalid password (DB realm)"
        throw new IncorrectCredentialsException("Invalid password for user '$username'")
    

    return account

【问题讨论】:

【参考方案1】:

看看AuthController.groovy -> signIn 操作。

这正是您需要登录的代码。主要步骤是

SecurityUtils.subject.login(new UsernamePasswordToken(username,password))

希望对您有所帮助...

好的。这只是起点……看看你在/Realms 上的领域代码。在那里你会找到一个authenticate(authToken) 闭包。似乎这是通过SecurityUtils.subject.login() 调用并处理凭据检查...

这应该可以解决您的哈希密码问题......

【讨论】:

并非如此。我不知道用户的密码。它是散列的:) 请看我的更新。似乎所有 SecurityUtils 方法都委托给您领域中的闭包。方法和闭包之间的联系并不是很明显...... 我不确定它应该如何解决散列密码问题。它检查用户名,如果存在则尝试进行身份验证:def account = new SimpleAccount(username, user.passwordHash, "ShiroDbRealm")。如何绕过密码哈希? 我猜你试图帮助我完成已经完成的步骤(无需密码登录用户),但当然我可能错了,我可能没有走上正确的道路。我想我想念的是以某种方式约束某些东西。无论如何,感谢您的努力! 嗯。在我的 LDAPRealm 中,authenticate(authToken) 闭包检查密码,如果没问题,则返回用户名。之后,用户登录。在此闭包中,您可以绕过密码检查,从而无需密码即可登录。 (您还可以在此处找到skipAuth 功能)。因此,您只需要一种机制来在此闭包中验证用户 ID 是否确实是您在第一步中从 facebook 获得的。【参考方案2】:

根据Javadoc,Subject.Builder() 不会自动将主题绑定到当前应用程序线程。在构建主题实例后尝试添加:

ThreadContext.bind(subject)

【讨论】:

以上是关于Grails - ShiroSecurity - 手动登录用户的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的项目中实现 Grails 的 Shiro 安全性

Grails:Grails3:doWithWebDescriptor?

用于 Grails 2.0 的 Grails/Gradle 插件

如何使用 grails 命令行编译 grails 项目?

是否可以在 Grails 之外使用 Grails 验证?如何?

Grails:企业级 Grails [关闭]