войти автоматически с Grails & Acegi - PullRequest
1 голос
/ 27 января 2010

Я использую плагин Acegi в своем приложении Grails. После регистрации пользователя он перенаправляется на защищенное действие. Поэтому ему показывается форма авторизации.

Однако я бы предпочел, чтобы пользователь автоматически вошел в систему, как только он завершит регистрацию. Кажется, что я мог бы достичь этого, перенаправив на действие, которое форма входа использует

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

Но это отправило бы HTTP-запрос клиенту (и обратно на сервер), который показывает пароль пользователя. Могу ли я войти в систему автоматически безопасным способом?

Спасибо, Дон

Ответы [ 3 ]

3 голосов
/ 27 января 2010

Если вы сгенерируете классы контроллера для плагина безопасности 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 - это текстовый пароль (т.е. не хэшированный), и он работает как брелок.

0 голосов
/ 18 августа 2011

Это ответ Берта Беквита (не мой)

(Оно было оставлено в комментарии Берта, но я думаю, что оно заслуживает того, чтобы быть более заметным)

Если у вас нет пароля, вы можете загрузить пользователя через

def user = User.findByUsername(username) 

и установка массива полномочий в конструкторе с 3 параметрами. Создайте авторизацию через

GrantedAuthority[] auths = user.authorities.collect { new GrantedAuthorityImpl(it.authority) }

Затем вы можете опустить вызов authenticate () и использовать:

SecurityContextHolder.context.authentication = new UsernamePasswordAuthenticationToken(username, 'unknown', auths) 
0 голосов
/ 27 января 2010

Я не пробовал это с не тестовым кодом, но это метод, который я создал для входа пользователя в свои интеграционные тесты (после создания / сохранения соответствующих пользователей / ролей в моей тестовой настройке):

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

Я создаю и внедряю токен аутентификации в контексте безопасности. Возможно, вам нужно сделать еще немного, чтобы войти в систему и пройти проверку безопасности, но это будет началом всего, что это есть.

Мне нужно сделать то же самое, что и вы, через неделю или две для моего текущего приложения, напишите, если вы полностью разберетесь, прежде чем я сделаю :).

...