Salut tout le monde !
Je viens de finir la partie du tuto J4 pour la sécurisation de l'espace d'administration et j'ai une petite faille dans le système lors de l'ajout d'un nouvel utilisateur... Il est en fait possible de rentrer un nouvel utilisateur dans ayant un mot de passe vide.
J'ai eu beau réfléchir à comment régler la chose, étant un total débutant sur cake, je n'ai pas trouvé l'idée pour empêcher ce souci.
Ou alors j'ai zappé un bout qui correspondait
Je mets ici mes codes :
Modèle User.php
<?php
class User extends AppModel{
/**
* Gestion des règles de validation du formulaire
**/
public $validate = array(
'username' => array(
'rule' => 'isUnique',
'allowEmpty'=> false,
'message' => "Ce nom d'utilisateur est déjà pris"
),
'password' => array(
'rule' => 'notEmpty',
'required' => false,
'message' => "Veuillez saisir un mot de passe"
),
'name' => array(
'rule' => 'notEmpty',
'message' => "La confirmation du mdp ne peut être vide"
),
'firstname' => array(
'rule' => 'notEmpty',
'message' => "La confirmation du mdp ne peut être vide"
)
);
function beforeSave($options = array()){
if(!empty($this->data'User']'password'])){
$this->data'User']'password'] = AuthComponent::password($this->data'User']'password']);
}
return true;
}
}
Controller UsersController.php
function admin_index(){
$d'users'] = $this->Paginate('User');
$this->set($d);
}
function admin_edit($id = null){
if($this->request->is('put') OR $this->request->is('post')){
$d = $this->request->data'User'];
if($d'password'] != $d'passwordconfirm']){
$this->Session->setFlash("Les mots de passe ne concordent pas", "notif", array('type'=>'error'));
}else{
if(empty($d'password']))
unset($d'password']);
if($this->User->save($d)){
// Affiche la notification de réussite en fonction de si c'est une modif ou un ajout direct
($this->request->is('put')) ? $this->Session->setFlash("Les informations de l'utilisateur ont bien été modifiées", 'notif'):$this->Session->setFlash("Un nouvel utilisateur a bien été ajouté", 'notif');
//$this->redirect(array('action'=>'index'));
}
}
}elseif($id){
$this->User->id = $id;
$this->request->data = $this->User->read();
}
// Vide la variable $d
$d = array();
$d'lvls'] = array('admin'=>'Adminstrateur', 'contributor'=>'Contributeurs');
$this->set($d);
}
function admin_delete($id){
$this->Session->setFlash("L'utilisateur a bien été supprimé", 'notif');
$this->User->delete($id);
$this->redirect($this->referer());
}
J'ai également une autre incompréhension quant à la manière d'empêcher un utilisateur n'ayant pas le level d'administrateur de pouvoir recourir à la fonction admin.delete() des posts par exemple ou bien carrément lui interdire toute action sur les utilisateurs si ce n'est voir la liste.
Et finalement, quand j'utilise une redirection à la fin de l'enregistrement des données, si jamais il y a des erreurs dans le remplissage des champs, ceux-ci ne s'affichent point, le formulaire n'est pas envoyé mais la redirection est effective contrairement à ce qui se passe dans le tuto Jour 1 pour le système de posts. (la redirection est commentée dans mon script).
Pouvez-vous également m'éclaicir sur ce point ??
Je vous remercie pour votre précieuse aide !