2011-08-04 14 views
5

Cuando mis usuarios inician sesión, visualizo sus detalles (nombre, correo electrónico) en la interfaz de usuario. Cuando actualicen su perfil, me gustaría mostrar los detalles actualizados, sin que el usuario para iniciar la sesión y vuelva a iniciarla.Zend_Auth y detalles de usuario que cambian dinámicamente en la interfaz de usuario

Los detalles de interfaz de usuario se recuperan de Zend_Auth a través de un ayudante de vista. Zend_Auth está almacenando los detalles de 'identidad' en una sesión.

¿Cómo debo proceder para la actualización de los datos en la sesión ?:

  • estaba considerando recuperar las credenciales de inicio de sesión del usuario de la base de datos y utilizarlos para llamar Zend_Auth-> autenticar() de nuevo. El problema es que no sé la contraseña, solo que es md5 hash. Podría considerar un nuevo método, reauthenticate(), que configuraba el adaptador para eludir el md5 y salt, pero esto parece laborioso.

  • Estaba pensando en escribir directamente en el espacio de nombres de sesión de Zend_Auth, pero esto parece una receta para problemas?

¿Has encontrado un problema similar? ¿Cómo lo manejaste?

¡Sus ideas son muy apreciadas!

+0

¿Está utilizando el correo electrónico como identidad y está cargando el nombre de la base de datos en su ayudante? –

Respuesta

0

Así es como he resuelto el problema por el momento. Aún no estoy seguro si es la mejor solución:

  • crear un contenedor para Zend_Auth
  • incluir una getAuthAdapter método ($ prima)
  • configurar el adaptador de manera diferente, dependiendo del valor de $ prima

    if (false === $raw) { 
        $this->_authAdapter->setCredentialTreatment('SHA1(CONCAT(?,salt))'); 
    } else { 
        $this->_authAdapter->setCredentialTreatment(); 
    } 
    
4

Puede actualizar la identidad de Zend_auth para el usuario actualmente conectado. La acción muy simplificada que actualiza solo el nombre de usuario podría ser la siguiente:

public function editAction() { 


    // check if user is logged, etc, and then 
    // show the edit user form and process the data after submission. 

    $userForm = new My_Form_EditUser();  


    if ($this->getRequest()->isPost()) { 
     if ($userForm->isValid($_POST)) { 

      // process the submitted data, 
      // and when you are sure that everything went ok, 
      // update the zend_auth identity 


      $authData = Zend_Auth::getInstance()->getIdentity(); 

      // this line would depend on the format of your 
      // identity data and a structure of your 
      // actual form. 
      $authData->property->nickname = $formData['user']['nickname']; 

      $this->_helper->FlashMessenger('Your data was changed'); 
      return $this->_redirect('/'); 
     } 
    }  

    $this->view->form = $userForm; 
} 

Espero que esto ayude.

+0

Hola Marcin. Para que esto funcione, la entidad debería almacenarse como un objeto. ¿Está bien? –

+0

@Kim. También debería trabajar con matrices. En este ejemplo, es un objeto solo porque en mi proyecto actual, almaceno mi identidad en dicho formato.Pero si usa matrices, entonces debería poder utilizar las notaciones de matriz para cambiar la identidad. – Marcin

2

Lo que realmente quiero es un método en Zend_Auth::setIdentity($user).

Pero a falta de tal método, he utilizado un truco en el que he creado un adaptador de autenticación que siempre devuelve éxito y establece la identidad para el mismo objeto de usuario que habría creado en un adaptador de autenticación "real" . Entonces simplemente llamo al Zend_Auth::authenticate($adapter) con ese adaptador y establece la identidad internamente.

Ahora, mirando mosre de cerca los detalles internos de Zend_Auth::authenticate(), veo que lo que podríamos hacer es simplemente:

Zend_Auth::getInstance()->getStorage()->write($user);

+0

Hola David. ¿Cómo funcionaría esto? Zend_Auth no tiene el método write() ni el método mágico __call() –

+0

D'oh! Error de tipografía. Correcto es 'Zend_Auth :: getInstance() -> getStorage() -> write ($ user);'. Corregir respuesta –

Cuestiones relacionadas