In meinem vorherigen Post habe ich geschrieben, wie man mit dem ZendFramework eine Spalte auf Eindeutigkeit prüft. Nun habe ich mit Zend_Auth herumgespielt. Diese Klasse ist für das Anmelden gegen eine definierte Datenquelle über einen Provider zuständig. Nun war meine pers. Anforderung, über Zend_Auth einen Login zu realisieren, welches auch aktive und inaktive User berücksichtigt. Ich habe dies in einem Modul integriert namens User.
Tabelle (gekürzt)
-- -- Tabellenstruktur für Tabelle `user` -- CREATE TABLE IF NOT EXISTS `user` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `username` VARCHAR(45) NOT NULL, `password` VARCHAR(45) NOT NULL, `firstname` VARCHAR(45) NOT NULL, `lastname` VARCHAR(45) NOT NULL, `email` VARCHAR(45) NOT NULL, `active` tinyint(4) DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`), ) ENGINE=InnoDB DEFAULT CHARSET=utf-8; |
Das Formular (vereinfacht):
// application/modules/user/form/Login.php class User_Form_Login extends Zend_Form { public function init() { // diese Felder kann man auch über Zend_Config realisieren $this->setAction('/user/authentication/login'); $this->setName('loginform'); $this->setMethod('post'); $username = new Zend_Form_Element_Text('username'); $username->setLabel('Benutzername'); $username->setRequired(); $password = new Zend_Form_Element_Password('password'); $password->setLabel('Passwort'); $password->setRequired(); $submit = new Zend_Form_Element_Submit('submit'); $submit->setLabel('Anmelden'); $this->addElements(array($username, $password, $submit)); } } |
Im View (gekürzt):
<?php // application/modules/user/views/scripts/authentication/login.phtml ?> <h1>Login</h1> <?= $this->form->render(); ?> |
Der Authentifizierungscontroller:
// application/modules/user/controller/Authentication.php class User_AuthenticationController extends Zend_Controller_Action { public function init() { /* Initialize action controller here */ } public function indexAction() { // action body } public function loginAction() { // schon eingeloggt? if (Zend_Auth::getInstance()->hasIdentity()) { $this->_redirect('/'); } $form = new User_Form_Login(); $this->view->form = $form; if ($this->getRequest()->isPost()) { $formData = $this->getRequest()->getPost(); if ($form->isValid($formData)) { $authAdapter = $this->getAuthAdapter(); $authAdapter->setIdentity($form->getValue('username')); $authAdapter->setCredential($form->getValue('password')); $auth = Zend_Auth::getInstance(); $res = $auth->authenticate($authAdapter); if ($res->isValid()) { $identity = $authAdapter->getResultRowObject(); $authStorage = $auth->getStorage(); $authStorage->write($identity); // ... } else { // ... } } else { $form->populate($formData); } } } public function logoutAction() { // action body Zend_Auth::getInstance()->clearIdentity(); $this->_redirect('/'); } /** * Liefert den AuthAdapter * * @return Zend_Auth_Adapter_DbTable */ private function getAuthAdapter() { return new Zend_Auth_Adapter_DbTable( Zend_Db_Table::getDefaultAdapter(), 'user', 'username', 'password' ); } } |
In meiner persönlichen Anforderung wollte ich aber, das man auch einen Aktivstatus realisiert. Wenn ein User sich also registriert, soll er erstmal inaktiv sein und sich entweder durch eine E-Mail oder den Admin aktiviert werden. Solange darf er sich natürlich nicht anmelden können. Dazu ist nur ein Parameter mehr erforderlich
/** * Liefert den AuthAdapter * * @return Zend_Auth_Adapter_DbTable */ private function getAuthAdapter() { return new Zend_Auth_Adapter_DbTable( Zend_Db_Table::getDefaultAdapter(), 'user', 'username', 'password', 'SHA1(?) AND active=1' // hier kann man den credentialColumn-Parameter anpassen ); } |
Vielleicht habt ihr ja noch weitere Möglichkeiten, den Loginprozess zu optimieren. Ich bin auf jeden Kommentar gespannt 🙂