Pregunta

Estoy usando el plugin Acegi en mi Griales aplicación. Después de un usuario se registra, es redirigido a una acción que está protegida. Por lo tanto, se muestra la forma de la conexión.

Sin embargo, yo preferiría si el usuario se registra automáticamente en cuanto se completa el registro. Parece como si pudiera conseguir esto mediante la reorientación de la acción que utiliza el formulario de acceso

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

Pero esto sería enviar una solicitud HTTP para el cliente (y de vuelta al servidor), que muestra la contraseña del usuario. ¿Hay alguna manera de que pueda acceder automáticamente a un modo seguro?

Gracias, Don

¿Fue útil?

Solución

Si genera las clases de controlador para el complemento de seguridad de resorte (griales generan-registro) verás las siguientes líneas en RegisterController la que hace exactamente lo que desee:

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: '/'
    }

Asegúrese de que params.passwd es la contraseña en texto plano (es decir, no algoritmo hash) y funciona como un encanto.

Otros consejos

No he probado esto con código no prueba, pero este es el método que he creado para registrar un usuario en dentro de mis pruebas de integración (después de la construcción / almacenamiento de los usuarios apropiados / papeles en mi configuración de la prueba):

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

construyo e inyectar el token de autenticación en el contexto de seguridad. Puede haber un poco más que lo que necesita hacer para obtener su usuario inicia sesión y la seguridad pasado, pero esto podría ser el comienzo de lo que es.

En realidad, tendrá que hacer exactamente lo que está pidiendo en una semana o dos para mi aplicación actual, palo, si te diste cuenta plenamente antes de hacerlo:.)

Esta es la respuesta de Burt Beckwith (no la mía)

(Se deja como un comentario por Burt, pero creo que merece ser más prominente)

Si no tiene la contraseña, puede cargar el usuario a través

def user = User.findByUsername(username) 

y el establecimiento de la matriz de autoridad en el constructor de 3 parámetros. Crear las auths a través de

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

A continuación, se puede omitir la llamada a la autenticación () y uso:

SecurityContextHolder.context.authentication = new UsernamePasswordAuthenticationToken(username, 'unknown', auths) 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top