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:Grails3:doWithWebDescriptor?
用于 Grails 2.0 的 Grails/Gradle 插件