El complemento Acegi/Spring Security Grails no ve cambios en una instancia de usuario

StackOverflow https://stackoverflow.com/questions/916473

  •  06-09-2019
  •  | 
  •  

Pregunta

Estoy escribiendo una aplicación web en Grails con el complemento Acegi/Spring Security y tengo problemas para que vea los cambios que hago en las instancias de usuario.Solo he estado trabajando con Groovy/Grails durante unas tres semanas, así que perdónenme si este problema es trivial, ya que he estado examinando listas de correo y tutoriales tratando de encontrar la respuesta.

He estado agregando nuevos atributos a la clase de dominio Usuario cada vez que necesito que un Usuario contenga más información, como un token de confirmación por correo electrónico o un nombre real, ya que no pude encontrar ninguna recomendación en sentido contrario.Todo parece estar bien para crear nuevos usuarios, pero cuando edito el usuario, los cambios aparecen en la lista de usuarios, pero las bibliotecas de etiquetas Acegi y las funciones asociadas no parecen ver los cambios.

Aquí está el fragmento relevante de UserController.update():

def person = User.get(params.id)
//...snip error checking...

//Update user attributes
person.username = params.email
person.email = params.email
person.userRealName = params.userRealName

//Attempt to save changes
if (person.save()) {
    //If successful, redirect back to profile viewing page
    redirect action: show, id: person.id
    return
}
else {
    //Otherwise, show errors and edit again
    render view: 'edit', model: buildPersonModel(person)
    return
}

Después de ejecutar este código, puedo ver los cambios si siempre obtengo los datos del usuario por ID, pero no si uso las etiquetas o funciones de Acegi.Por ejemplo, esto no funciona:

loggedInUserInfo(field:'realName')

Pero esto hace:

User.get(loggedInUserInfo(field:'id').toLong()).realName

la nueva informacion a veces aparece después de cerrar sesión y volver a iniciar sesión, pero generalmente no aparece, y a menudo no aparece incluso después de tres o más reinicios.Además, intenté agregar "flush:true" a person.save() sin ningún efecto.

(Pregunta periférica:¿Es malo para mí jugar así con la clase Usuario?Si no, ¿cuál es la mejor manera de agregarle información?)

Actualización después de más investigación:Parece que si uso loggedInUserInfo() en una página normal, funciona bien, pero si lo uso dentro de un diseño, muestra el comportamiento que describí.¿Podría estar sucediendo algún problema extraño con el almacenamiento en caché?

¿Fue útil?

Solución

Tengo una solución para este problema y también he creado una JIRA entrada para el problema.

Parece que hay un error en la forma en Acegi actualiza sus usuarios internos. I proporcionar una solución en la forma de un filtro griales que actualiza autoridades del usuario manualmente cada vez que se accede a un controlador. No es ideal, pero funciona.

Saludos,

Otros consejos

corriste griales generan-manager después de modificar su clase de usuario?

Acegi almacena información del usuario, si no recuerdo mal. Compruebe el archivo 'DefaultSecurityConfig' (creo que así se llama, bajo config /) para desactivar la información del usuario caché. También puede llamar a un método en authenticateService (no recuerdo qué método en este momento) para desalojar a la caché de usuario.

Es posible que pueda encontrar este último dentro del cierre UserController#update.

Me enfrenté al mismo problema y seguí el consejo dado por Maximilian Schweitzer anteriormente.No me funcionó al principio.

Pruebe estos pasos y vea si resuelve el problema:

  1. Ejecuté generate-manager según la respuesta anterior de Maximilian Schweitzer.
  2. Intenté iniciar sesión con usuarios creados antes de ejecutar generate-manager - No funcionó
  3. Creé un nuevo usuario (con un nuevo UserController, gsp, etc.)
  4. Intenté iniciar sesión con un nuevo usuario y funciona bien.
  5. Se eliminaron usuarios antiguos creados antes y se volvieron a crear.Funcionó bien.

Aunque no estoy seguro si se aplica a su situación.

¡HH!

Me estaba enfrentando el mismo problema. Mi solución era hacer una actualización del plugin acegi a la versión 0.5.1 (0.5.1 acegi - Grails Spring Security 2.0 Plugin).

A continuación, me he fijado en /plugins/acegi-0.5.1/grails-app/conf/DefaultSecurityConfig.groovy

cacheUsers = false

y ahora listo! se está trabajando!

Luis

Hay que restablecer el usuario autenticado. El código siguiente hace justamente eso (de este blog ).

import org.springframework.security.context.SecurityContextHolder
import org.springframework.security.providers.UsernamePasswordAuthenticationToken
import org.codehaus.groovy.grails.plugins.springsecurity.GrailsUserImpl
import org.springframework.security.GrantedAuthority
import org.springframework.security.GrantedAuthorityImpl

...

def refreshAuthenticatedUser(user) {
    GrantedAuthority[] auths = user.authorities.collect {
        new GrantedAuthorityImpl(it.authority)
    }
    def grailsUser = new GrailsUserImpl(
            user.username,
            "",
            user.enabled,
            true,
            true,
            true,
            auths,
            user)
    def authToken = new UsernamePasswordAuthenticationToken(grailsUser, '', auths)
    SecurityContextHolder.context.authentication = authToken

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top