使用 Grails 和 Acegi 自动登录
Posted
技术标签:
【中文标题】使用 Grails 和 Acegi 自动登录【英文标题】:login automatically with Grails & Acegi 【发布时间】:2011-01-09 19:04:54 【问题描述】:我在我的 Grails 应用程序中使用 Acegi 插件。用户注册后,他会被重定向到受保护的操作。因此,他会看到登录表单。
但是,我希望用户在完成注册后立即自动登录。看来我可以通过重定向到登录表单使用的操作来实现这一点
redirect(uri:"/j_acegi_security_check?j_username=$username&j_password=$passed")
但这会向客户端(并返回服务器)发送一个显示用户密码的 HTTP 请求。有没有一种方法可以安全地自动登录?
谢谢, 唐
【问题讨论】:
【参考方案1】:如果您为 spring 安全插件 (grails generate-registration) 生成控制器类,您将在 RegisterController 中看到以下行,这正是您想要的:
class RegisterController
def daoAuthenticationProvider
...
def save =
...
def auth = new AuthToken(person.username, params.passwd)
def authtoken = daoAuthenticationProvider.authenticate(auth)
SecurityContextHolder.context.authentication = authtoken
redirect uri: '/'
请确保 params.passwd
是纯文本密码(即未经过哈希处理),它的作用就像一个魅力。
【讨论】:
AuthToken类的封装是什么?【参考方案2】:我没有用非测试代码尝试过这个,但这是我创建的用于在我的集成测试中登录用户的方法(在我的测试设置中构建/保存适当的用户/角色之后):
import org.codehaus.groovy.grails.plugins.springsecurity.GrailsDaoAuthenticationProvider
import org.springframework.security.providers.UsernamePasswordAuthenticationToken
import org.springframework.security.context.SecurityContextHolder
...
def logInAsUser(username, password)
daoAuthenticationProvider.getUserCache().removeUserFromCache(username)
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, password)
SecurityContextHolder.context.authentication = daoAuthenticationProvider.authenticate(token)
我在安全上下文中构造并注入身份验证令牌。您可能需要做更多的事情才能让您的用户登录并通过安全性,但这将是一切的开始。
实际上,我需要在一两周内为我当前的应用程序完全按照您的要求做,如果您在我做之前完全弄清楚,请回复:)。
【讨论】:
如果您有密码,这将有效。如果不这样做,您可以通过 'def user = User.findByUsername(username)' 加载用户并在 3 参数构造函数中设置权限数组。通过“GrantedAuthority[] auths = user.authorities.collect new GrantedAuthorityImpl(it.authority) ”创建授权。然后你可以省略对 authenticate() 的调用并使用 'SecurityContextHolder.context.authentication = new UsernamePasswordAuthenticationToken(username, 'unknown', auths)' 这真的有效吗?我试过不成功,只有在提供密码的情况下才有效 您实际上希望将用户作为第一个参数传递给 UsernamePasswordAuthenticationToken 构造函数而不是用户名,但除此之外,它可以工作:-)【参考方案3】:这是 Burt Beckwith 的回答(不是我的)
(这是 Burt 留下的评论,但我认为它应该更突出)
如果没有密码,可以通过
加载用户def user = User.findByUsername(username)
并在三参数构造函数中设置权限数组。通过
创建身份验证GrantedAuthority[] auths = user.authorities.collect new GrantedAuthorityImpl(it.authority)
然后你可以省略对 authenticate() 的调用并使用:
SecurityContextHolder.context.authentication = new UsernamePasswordAuthenticationToken(username, 'unknown', auths)
【讨论】:
以上是关于使用 Grails 和 Acegi 自动登录的主要内容,如果未能解决你的问题,请参考以下文章