Archive for août, 2007

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