2012-06-11 1 views
2

J'ai récemment commencé à utiliser Zend Framework et je suis encore assez utilisé pour session_start, et l'attribution des variables à certains noms de session (à savoir: $ _SESSION [ 'username'] == $ username)Comment stocker et modifier l'identifiant de session Zend_Auth?

Je suis en train pour comprendre comment faire quelque chose de similaire à Zend. À l'heure actuelle, mon script d'authentification vérifie les informations d'identification à l'aide de LDAP sur mon serveur AD et, en cas de succès, authentifie l'utilisateur.

Je veux créer un script qui permettra à un utilisateur admin d'entrer facilement la session de quelqu'un d'autre. Supposons que admin1 ait une session active et souhaite passer à la session de l'utilisateur1. Normalement, je voudrais juste changer la variable $ _SESSION ['nom d'utilisateur'] et changer efficacement l'identité de l'utilisateur connecté.

Mais avec Zend, je ne suis pas sûr de savoir comment changer les informations de session. Pour ce que ça vaut, voici mon script d'authentification:

class LoginController extends Zend_Controller_Action 
{ 
    public function getForm() 
    { 
     return new LoginForm(array(
      'action' => '/login/process', 
      'method' => 'post', 
     )); 
    } 

    public function getAuthAdapter(array $params) 
    { 
     $username = $params['username']; 
     $password = $params['password']; 
     $auth = Zend_Auth::getInstance(); 

     require_once 'Zend/Config/Ini.php'; 
     $config = new Zend_Config_Ini('../application/configs/application.ini', 'production'); 
     $log_path = $config->ldap->log_path; 
     $options = $config->ldap->toArray(); 
     unset($options['log_path']); 

     require_once 'Zend/Auth/Adapter/Ldap.php'; 
     $adapter = new Zend_Auth_Adapter_Ldap($options, $username, $password); 

     $result = $auth->authenticate($adapter); 

     if ($log_path) { 
      $messages = $result->getMessages(); 

      require_once 'Zend/Log.php'; 
      require_once 'Zend/Log/Writer/Stream.php'; 
      require_once 'Zend/Log/Filter/Priority.php'; 
      $logger = new Zend_Log(); 
      $logger->addWriter(new Zend_Log_Writer_Stream($log_path)); 
      $filter = new Zend_Log_Filter_Priority(Zend_Log::DEBUG); 
      $logger->addFilter($filter); 

      foreach ($messages as $i => $message) { 
       if ($i-- > 1) { // $messages[2] and up are log messages 
        $message = str_replace("\n", "\n ", $message); 
        $logger->log("Ldap: $i: $message", Zend_Log::DEBUG); 
       } 
      } 
     } 
     return $adapter; 
    } 
    public function preDispatch() 
    { 
     if (Zend_Auth::getInstance()->hasIdentity()) { 
      // If the user is logged in, we don't want to show the login form; 
      // however, the logout action should still be available 
      if ('logout' != $this->getRequest()->getActionName()) { 
       $this->_helper->redirector('index', 'index'); 
      } 
     } else { 
      // If they aren't, they can't logout, so that action should 
      // redirect to the login form 
      if ('logout' == $this->getRequest()->getActionName()) { 
       $this->_helper->redirector('index'); 
      } 
     } 
    } 
    public function indexAction() 
    { 
     $this->view->form = $this->getForm(); 
    } 
    public function processAction() 
    { 
     $request = $this->getRequest(); 

     // Check if we have a POST request 
     if (!$request->isPost()) { 
      return $this->_helper->redirector('index'); 
     } 

     // Get our form and validate it 
     $form = $this->getForm(); 
     if (!$form->isValid($request->getPost())) { 
      // Invalid entries 
      $this->view->form = $form; 
      return $this->render('index'); // re-render the login form 
     } 

     // Get our authentication adapter and check credentials 
     $adapter = $this->getAuthAdapter($form->getValues()); 
     $auth = Zend_Auth::getInstance(); 
     $result = $auth->authenticate($adapter); 
     if (!$result->isValid()) { 
      // Invalid credentials 
      $form->setDescription('Invalid credentials provided'); 
      $this->view->form = $form; 
      return $this->render('index'); // re-render the login form 
     } 

     // We're authenticated! Redirect to the home page 

     $this->_helper->redirector('index', 'index'); 

    } 
    public function logoutAction() 
    { 
     Zend_Auth::getInstance()->clearIdentity(); 
     $this->_helper->redirector('index'); // back to login page 
    } 
} 

Y at-il un moyen de faire ce que j'ai décrit? Merci pour vos suggestions

Répondre

2

Compte tenu de votre code, le résultat de l'authentification est stocké dans la session PHP via un objet Zend_Auth_Storage_Session.

L'appel Zend_Auth::getIdentity() accède au stockage et renvoie le résultat s'il n'est pas vide. De même, vous pouvez modifier l'identité stockée en accédant au stockage sous-jacent et en modifiant sa valeur. L'identité réelle stockée à la suite de l'authentification avec Zend_Auth_Adapter_Ldap est juste une valeur de chaîne représentant le nom d'utilisateur LDAP.

Pour modifier efficacement l'utilisateur connecté, vous pouvez faire:

Zend_Auth::getInstance()->getStorage()->write('newUserName'); 

Cela suppose que le comportement par défaut qui devrait être mis en place compte tenu de votre code. Ce que je fais dans mes applications après une authentification réussie est de créer un nouvel objet d'un modèle utilisateur, et d'écrire cela dans la session Zend_Auth pour avoir plus d'informations sur l'utilisateur disponible dans chaque session, donc vous devriez être conscient que différentes choses peuvent être dans le stockage en fonction de l'application.

C'est ce que je fais par exemple:

$auth  = new Zend_Auth(...); 
$authResult = $auth->authenticate(); 

if ($authResult->isValid() == true) { 
    $userobj = new Application_Model_UserSession(); 
    // populate $userobj with much information about the user 
    $auth->getStorage()->write($userobj); 
} 

maintenant partout dans ma demande que j'appelle Zend_Auth::getInstance()->getIdentity() je rentrerai l'objet Application_Model_UserSession plutôt qu'une chaîne; mais je m'égare.

Les informations qui devraient vous aider est:

$user = Zend_Auth::getInstance()->getIdentity(); // reads from auth->getStorage() 

Zend_Auth::getInstance()->getStorage()->write($newUser); 
+0

Vous monsieur, sont une bouée de sauvetage. Cela a fait l'affaire. Maintenant, j'ai une question quelque peu liée mais sans rapport. Le résultat actuel de l'objet utilisateur $ est \ MYDIRECTORY \ nom d'utilisateur. La valeur \ MYDIRECTORY \ est essentiellement ce qui est défini dans mon fichier application.ini en tant que 'ldap.server2.accountDomainNameShort' Y a-t-il une raison pour laquelle cela fonctionne également? –

+0

Le préfixe est spécifique à l'adaptateur LDAP, j'ai remarqué que l'authentification HTTP fait quelque chose de similaire avec le domaine. Est-ce le domaine qui commence à être ajouté? Je pense que c'est juste pour que vous puissiez regarder en arrière et savoir d'où ils ont été authentifiés. Vous n'aurez probablement besoin de rajouter que lorsque vous modifierez la session manuellement si votre application s'en remet d'une manière ou d'une autre, sinon vous pouvez l'omettre en toute sécurité. – drew010

Questions connexes