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
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? –
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