sfGuard extension gestion d’une arborescence Lundi, août 13th, 2007
Une fois les étapes de création du projet, je commencerai à m’intéresser à l’objet User.
symfony propel-generate-crud back user User
Maintenant un petit jeu de données sur le modèle proposé par Askeet (le salted SHA1 me plait bien!!)
User:
mazenovi:
username: mazenovi
prenom: Vincent
nom: Mazenod
password: mazenovi
email: mazenovi@caramail.com
blog: http://blog.onfamp.net
homepage: http://vmazenod.free.fr
presentation: un petit mot pour dire que
r1bzh:
username: r1bzh
password: r1bzh
ld:
username: ld
password:
Pour que ca marche il faut écrire la méthode setPassword dans lib/model/User.php
<?
class User extends BaseUser
{
public function setPassword($password)
{
$salt = md5(rand(100000, 999999).$this->getUsername().$this->getEmail());
$this->setSalt($salt);
$this->setSha1Password(sha1($salt.$password));
}
}
on écrit le script de chargement
<?php
define(’SF_ROOT_DIR’, realpath(dirname(__FILE__).’/..’));
define(’SF_APP’, ‘back’);
define(’SF_ENVIRONMENT’, ‘dev’);
define(’SF_DEBUG’, true);
require_once(SF_ROOT_DIR.DIRECTORY_SEPARATOR.’apps’.DIRECTORY_SEPARATOR.SF_APP.DIRECTORY_SEPARATOR.’config’.DIRECTORY_SEPARATOR.’config.php’);
// initialize database manager
$databaseManager = new sfDatabaseManager();
$databaseManager->initialize();
$data = new sfPropelData();
$data->loadData(sfConfig::get(’sf_data_dir’).DIRECTORY_SEPARATOR.’fixtures’);
?>
on l’exécute
php batch/load_data.php
Reste à gérer l’authentification.
On commence par ajouter une action login au controleur
public function executeLogin()
{
if ($this->getRequest()->getMethod() != sfRequest::POST)
{
return sfView::SUCCESS;
}
else
{
return $this->redirect(’@homepage’);
}
}
Ensuite la vue correspondante loginSuccess.php
<style>
.form_error{
color: purple;
font-size: 12px;
}
#form_login{
text-align: center;
}
</style>
<?php echo form_tag(’user/login’,Array(’id’=>’form_login’)) ?>
<?php use_helper(’Validation’) ?>
<table>
<tr>
<td>nom d’utilisateur</td>
<td>
<?php echo form_error(’username’)?>
<?php echo input_tag(’username’, $sf_params->get(’username’)) ?>
</td>
</tr>
<tr>
<td>password</td>
<td>
<?php echo form_error(’password’)?>
<?php echo input_password_tag(’password’) ?>
</td>
</tr>
<tr>
<th colspan="2">
<?php echo input_hidden_tag(’referer’, $sf_request->getAttribute(’referer’)) ?>
<?php echo submit_tag(’sign in’) ?>
</th>
</tr>
</table>
</form>
Maintenant la validation du formulaire d’uathentification apps/back/modules/user/validate/login.yml
methods:
post: [username, password]
names:
username:
required: true
required_msg: le nom d’utilisateur est obligatoire
validators: [usernameValidator, userValidator]
password:
required: true
required_msg: le mot de passe est obligatoire
usernameValidator:
class: sfStringValidator
param:
min: 2
min_error: le mote de passe doit comporter plus de 2 caractères
userValidator:
class: myLoginValidator
param:
password: password
login_error: nom d’utilisateur ou mot de passe invalide
Une fois fait reste à écrire le Helper de validation apps/back/lib/myLoginValidator.class.php
<?php
class myLoginValidator extends sfValidator
{
public function initialize($context, $parameters = null)
{
parent::initialize($context);
$this->setParameter(’login_error’, ‘Invalid input’);
$this->getParameterHolder()->add($parameters);
return true;
}
public function execute(&$value, &$error)
{
$password_param = $this->getParameter(’password’);
$password = $this->getContext()->getRequest()->getParameter($password_param);
$login = $value;
$c = new Criteria();
$c->add(UserPeer::USERNAME, $login);
$user = UserPeer::doSelectOne($c);
if ($user)
{
if (sha1($user->getSalt().$password) == $user->getSha1Password())
{
$this->getContext()->getUser()->signIn($user);
return true;
}
}
$error = $this->getParameter(’login_error’);
return false;
}
}
Reste encore à écrire les méthodes signIn et signOut du sf User dans apps/back/lib/myUser.class.php
<?php
class myUser extends sfBasicSecurityUser
{
public function signIn($user)
{
$this->setAuthenticated(true);
$this->setAttribute(’nom’, $user->getNom());
$this->setAttribute(’prenom’, $user->getPrenom());
$this->setAttribute(’username’, $user->getUsername());
}
public function signOut()
{
$this->getAttributeHolder()->clear();
$this->clearCredentials();
$this->setAuthenticated(false);
}
public function getUsername()
{
return $this->getAttribute(’username’);
}
public function getPrenom()
{
return $this->getAttribute(’prenom’);
}
public function getNom()
{
return $this->getAttribute(’nom’);
}
public function __toString(){
return $this->getUsername();
}
}
vider le cache de symfony
symfony cc
et faire un teste sur http://mydomain/user/login