Zend Auth Module
Ik heb Zend Framework nu goed onder de knie. Daarom ben ik opzoek naar een veilig en gemakkelijk uit te breiden login/registratie module. Uiteraard voor Zend Framework. Is dit beschikbaar? Misschien een module?
Ik weet niet of het er is (zal wel denk ik) maar het is opzich vrij simpel. Je bouwt het op in de volgende stappen:
1. Je maakt een formulier met eventueel Zend_Form:
Controleer bovenstaande zaken goed, want dit heb ik zo uit mijn project geknipt :) O.a. form action, klasse naam. Zorg ook dat de form goed geladen kan worden door de autoloader.
2. Je maakt een frontcontroller plugin die authenticatie doet.
Hieronder ook even de mijne. Ik werk met een Admin module dus die check zul je wellicht weg moeten halen:
Wat er gebeurt:
Er wordt gecontroleerd of de huidige module admin is (wellicht moet je dat weghalen). Daarna Controleer Zend_Auth of de gebruiker al ingelogd is, zoniet dan wordt de gebruiker doorgestuurd naar de logincontroller en login action. Dit doe je via het request object.
3. Dan nog een logincontroller:
Met bovenstaand wordt ervoor gezorgd dat als iemand al ingelogd is deze doorgestuurd wordt naar de index controller. Zo niet, controleerd hij het formulier, is deze valid dan wordt er geprobeerd de gebruiker te authenticeren. Ik gebruik in mijn geval een eigen Auth_Adapter dat komt omdat ik Doctrine gebruik. Gebruik je Zend Framework als DAL/ORM dan kun je Zend_Auth_Adapter_DbTable gebruiken als ik het goed heb.
Dat is het voor een groot deel. Je moet nog wel view scripts maken een layout en nog wat instellingen in je application.ini om te zorgen dat de frontcontroller plugins geladen worden en bijvoorbeeld je form objecten.
Ik hoop dat je er wat mee kan, mocht je ergens niet uitkomen post maar :) Hallo Allard,
Wat betreft het ophalen van je gegevens en opslaan, hiervoor gebruik je dus de Zend_Auth_Adapter_DbTable mee, en dat object geef je de tabelnaam en columns mee e.d.
Zou ook een keer op ZendCasts kijken daar staat zeker een voorbeeldje tussen ergens:
http://www.zendcasts.com Nee registratie is hier nog niet verwerkt. Je zou dan een registerAction kunnen maken in je loginController en een registerform object. Oke, dank je voor de goede tips. Ik vond op Google net deze tutorial. Is deze een beetje veilig? En zit hij een beetje goed in elkaar (script)?
Edit:
Nog bedankt voor de tutorial, het is nu een stuk duidelijker geworden. Oke, bedankt voor de info. Ik heb Zend Framework al wel aardig onder de knie. Ik vroeg inderdaad om een compleet systeem. Dit deed ik met een rede, het leek me wat veiliger. En dat boek, die heb ik inmiddels aangeschaft. Misschien een wat late reactie, maar op Akrabat zijn ook hele mooie tutorials te vinden. De persoon die dat schrijft ontwikkeld volgens mij ook mee aan Zend Framework:
Ik weet niet of het er is (zal wel denk ik) maar het is opzich vrij simpel. Je bouwt het op in de volgende stappen:
1. Je maakt een formulier met eventueel Zend_Form:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
/**
* LoginForm
*
* @author kees <[email protected]>
*/
class Admin_Form_LoginForm extends Zend_Form
{
public function init() {
$this->setName('Inloggen');
$this->setAction('/admin/login/login');
$this->setMethod('POST');
$username = new Zend_Form_Element_Text('username');
$username->setLabel('Gebruikersnaam')
->setRequired(true)
->removeDecorator('Errors')
->addValidator('NotEmpty');
$password = new Zend_Form_Element_Password('password');
$password->setLabel('Wachtwoord')
->setRequired(true)
->removeDecorator('Errors')
->addValidator('NotEmpty');
$submit = new Zend_Form_Element_Submit('submit');
$submit->setLabel('Inloggen')
->setAttrib('class', 'submit');
$this->addElements(array($username,
$password, $submit));
}
}
?>
/**
* LoginForm
*
* @author kees <[email protected]>
*/
class Admin_Form_LoginForm extends Zend_Form
{
public function init() {
$this->setName('Inloggen');
$this->setAction('/admin/login/login');
$this->setMethod('POST');
$username = new Zend_Form_Element_Text('username');
$username->setLabel('Gebruikersnaam')
->setRequired(true)
->removeDecorator('Errors')
->addValidator('NotEmpty');
$password = new Zend_Form_Element_Password('password');
$password->setLabel('Wachtwoord')
->setRequired(true)
->removeDecorator('Errors')
->addValidator('NotEmpty');
$submit = new Zend_Form_Element_Submit('submit');
$submit->setLabel('Inloggen')
->setAttrib('class', 'submit');
$this->addElements(array($username,
$password, $submit));
}
}
?>
Controleer bovenstaande zaken goed, want dit heb ik zo uit mijn project geknipt :) O.a. form action, klasse naam. Zorg ook dat de form goed geladen kan worden door de autoloader.
2. Je maakt een frontcontroller plugin die authenticatie doet.
Hieronder ook even de mijne. Ik werk met een Admin module dus die check zul je wellicht weg moeten halen:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?php
/**
*
* @author kees <[email protected]>
*/
class BestBuy_Controller_Plugin_AdminAuth extends Zend_Controller_Plugin_Abstract
{
public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
{
if ($request->getModuleName() == 'admin') {
$auth = Zend_Auth::getInstance();
if (!$auth->hasIdentity()) {
//forward user to the login page!
$request->setModuleName('admin');
$request->setControllerName('login');
$request->setActionName('login');
}
}
}
}
?>
/**
*
* @author kees <[email protected]>
*/
class BestBuy_Controller_Plugin_AdminAuth extends Zend_Controller_Plugin_Abstract
{
public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
{
if ($request->getModuleName() == 'admin') {
$auth = Zend_Auth::getInstance();
if (!$auth->hasIdentity()) {
//forward user to the login page!
$request->setModuleName('admin');
$request->setControllerName('login');
$request->setActionName('login');
}
}
}
}
?>
Wat er gebeurt:
Er wordt gecontroleerd of de huidige module admin is (wellicht moet je dat weghalen). Daarna Controleer Zend_Auth of de gebruiker al ingelogd is, zoniet dan wordt de gebruiker doorgestuurd naar de logincontroller en login action. Dit doe je via het request object.
3. Dan nog een logincontroller:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
/**
* LoginController
*
* @author kees <[email protected]>
*/
class Admin_LoginController extends Zend_Controller_Action
{
public function preDispatch()
{
$this->_helper->_layout->setLayout('login');
}
public function indexAction()
{
$this->_forward('login');
}
/**
* If a valid post is send and the form validates we check wether user can succesfully
* authenticate with given details. If it fails user will still get the login page with a
* global error message for securiry reasons. If a login attempt fails on which reason that may
* be the qserver waits 3 seconds before responding against brute force attacks.
*/
public function loginAction()
{
// If we're already logged in, just redirect
if (Zend_Auth::getInstance()->hasIdentity()) {
$this->_redirect('/admin/');
}
$this->view->headTitle('Inloggen');
$form = new Admin_Form_LoginForm();
$request = $this->getRequest();
if ($request->isPost()) {
$post = $request->getPost();
if ($form->isValid($post)) {
$auth = Zend_Auth::getInstance();
$result = $auth->authenticate(new BestBuy_Auth_Adapter($post['username'], $post['password']));
if ($result->isValid()) {
$this->_redirect('/admin/index/index');
} else {
$this->view->error = implode('<br />', $result->getMessages());
}
} else {
$this->view->error = 'Velden gebruikersnaam en wachtwoord zijn verplicht.';
}
}
$this->view->form = $form;
}
public function logoutAction() {
Zend_Session::destroy();
$this->_redirect('/admin');
}
}
?>
/**
* LoginController
*
* @author kees <[email protected]>
*/
class Admin_LoginController extends Zend_Controller_Action
{
public function preDispatch()
{
$this->_helper->_layout->setLayout('login');
}
public function indexAction()
{
$this->_forward('login');
}
/**
* If a valid post is send and the form validates we check wether user can succesfully
* authenticate with given details. If it fails user will still get the login page with a
* global error message for securiry reasons. If a login attempt fails on which reason that may
* be the qserver waits 3 seconds before responding against brute force attacks.
*/
public function loginAction()
{
// If we're already logged in, just redirect
if (Zend_Auth::getInstance()->hasIdentity()) {
$this->_redirect('/admin/');
}
$this->view->headTitle('Inloggen');
$form = new Admin_Form_LoginForm();
$request = $this->getRequest();
if ($request->isPost()) {
$post = $request->getPost();
if ($form->isValid($post)) {
$auth = Zend_Auth::getInstance();
$result = $auth->authenticate(new BestBuy_Auth_Adapter($post['username'], $post['password']));
if ($result->isValid()) {
$this->_redirect('/admin/index/index');
} else {
$this->view->error = implode('<br />', $result->getMessages());
}
} else {
$this->view->error = 'Velden gebruikersnaam en wachtwoord zijn verplicht.';
}
}
$this->view->form = $form;
}
public function logoutAction() {
Zend_Session::destroy();
$this->_redirect('/admin');
}
}
?>
Met bovenstaand wordt ervoor gezorgd dat als iemand al ingelogd is deze doorgestuurd wordt naar de index controller. Zo niet, controleerd hij het formulier, is deze valid dan wordt er geprobeerd de gebruiker te authenticeren. Ik gebruik in mijn geval een eigen Auth_Adapter dat komt omdat ik Doctrine gebruik. Gebruik je Zend Framework als DAL/ORM dan kun je Zend_Auth_Adapter_DbTable gebruiken als ik het goed heb.
Dat is het voor een groot deel. Je moet nog wel view scripts maken een layout en nog wat instellingen in je application.ini om te zorgen dat de frontcontroller plugins geladen worden en bijvoorbeeld je form objecten.
Ik hoop dat je er wat mee kan, mocht je ergens niet uitkomen post maar :)
Oke, bedankt. Maar is er ook een registratie veld? En, waar slaat hij alle gegevens op? In een database?
Wat betreft het ophalen van je gegevens en opslaan, hiervoor gebruik je dus de Zend_Auth_Adapter_DbTable mee, en dat object geef je de tabelnaam en columns mee e.d.
Zou ook een keer op ZendCasts kijken daar staat zeker een voorbeeldje tussen ergens:
http://www.zendcasts.com
Welke tutorial?
Sorry, heb het al aangepast...
Het zal vast veilig zijn maar vind het geen mooie tutorial omdat het geen frontcontroller plugin gebruikt, waardoor je overal en altijd moet controleren of iemand ingelogd is, tenzij je dat wilt uiteraard.
Tuurlijk, heb je misschien een goede tutorial? Misschien met database en registratie pagina?
http://www.zendcasts.com/logging-in-users-using-doctrine-and-zend_auth/2010/01/
Maar dit is dan wel met Doctrine en niet Zend_Db. Maar jij vraagt volgens mij een compleet iets. Niet verkeerd bedoeld maar hoe goed beheer je al Zend Framework omdat je zegt ZF al redelijk onder de knie te hebben?
Als ik jou was zou ik je wat verdiepen in Forms, Zend_Auth, ORM in ZF of andere lib (Propal, Doctrine, etc). Dat zijn wel de basis elementen voor het opzetten van authenticatie en registratie pagina's e.d.
Het boek Leer jezelf professioneel Zend Framework van Wouter Tengeler is een echte aanrader daarvoor maar je zou ook een aantal video's kunnen kijken op ZendCasts en je ook al een heel eind :)
Ik heb deze tutorial gevolgd voor het inloggen; Maar dit is dan wel met Doctrine en niet Zend_Db. Maar jij vraagt volgens mij een compleet iets. Niet verkeerd bedoeld maar hoe goed beheer je al Zend Framework omdat je zegt ZF al redelijk onder de knie te hebben?
Als ik jou was zou ik je wat verdiepen in Forms, Zend_Auth, ORM in ZF of andere lib (Propal, Doctrine, etc). Dat zijn wel de basis elementen voor het opzetten van authenticatie en registratie pagina's e.d.
Het boek Leer jezelf professioneel Zend Framework van Wouter Tengeler is een echte aanrader daarvoor maar je zou ook een aantal video's kunnen kijken op ZendCasts en je ook al een heel eind :)
Edit:
Nog bedankt voor de tutorial, het is nu een stuk duidelijker geworden.