1

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

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

redirect(uri:"/j_acegi_security_check?j_username=${username}&j_password=${passed}")

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

谢谢,唐

4

3 回答 3

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是纯文本密码(即没有散列),它就像一个魅力。

于 2010-01-27T11:10:58.727 回答
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)
}

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

实际上,我需要在一两周内为我当前的应用程序完全按照您的要求做,如果您在我做之前完全弄明白,请回复:)。

于 2010-01-27T04:04:28.893 回答
0

这是伯特贝克威斯的答案(不是我的)

(这是 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) 
于 2011-08-18T19:13:41.900 回答