使用Grails& Acegi的

时间:2010-01-27 02:34:32

标签: security grails spring-security grails-plugin

我在Grails应用程序中使用Acegi插件。用户注册后,他将被重定向到受保护的操作。因此,他会看到登录表格。

但是,我希望用户在完成注册后立即自动登录。看起来我可以通过重定向到登录表单使用的操作

来实现这一点
redirect(uri:"/j_acegi_security_check?j_username=${username}&j_password=${passed}")

但这会向客户端发送HTTP请求(并返回服务器),显示用户的密码。有没有办法以安全的方式自动登录?

谢谢, 唐

3 个答案:

答案 0 :(得分:3)

如果为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是纯文本密码(即没有哈希),它就像魅力一样。

答案 1 :(得分:0)

我没有尝试使用非测试代码,但这是我在集成测试中记录用户的方法(在我的测试设置中构建/保存适当的用户/角色之后):

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)
}

我在安全上下文中构造并注入身份验证令牌。为了让您的用户登录和过去的安全性,您可能需要做更多的事情,但这将是任何事情的开始。

我实际上需要在一两周内完成你当前应用程序所要求的内容,如果你在我做之前完全弄清楚,请回复:)。

答案 2 :(得分:0)

这是Burt Beckwith的答案(不是我的)

(这是Burt留下的评论,但我认为它应该更加突出)

如果您没有密码,可以通过

加载用户
def user = User.findByUsername(username) 

并在3参数构造函数中设置权限数组。通过

创建身份验证
GrantedAuthority[] auths = user.authorities.collect { new GrantedAuthorityImpl(it.authority) }

然后你可以省略对authenticate()的调用并使用:

SecurityContextHolder.context.authentication = new UsernamePasswordAuthenticationToken(username, 'unknown', auths)