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; |
--
-- 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));
}
} |
// 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(); ?> |
<?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'
);
}
} |
// 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
);
} |
/**
* 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 🙂
Related Posts: