bonjour,
Je suis débutante sur cake PHP, j'ai suivi les différentes vidéos de formations ainsi que la suite de tutoriel créer un site avec cakePHP.
Donc voilà mon problème, j'ai essayé de suivre le tuto du jour 4, mais impossible.
EN effet la méthode auth n’étant plus la même il m'est impossible de me connecter. Cela m'indique toujours "Votre identifiant ou mdp est incorrect".
COmment réadapter le code du tuto et le code prévu pour a version 2.4 ? Tut en sachant que j'ai essayé le tuto du book cakePHP
je vous joint mes codes
Appcontroller :
<?php
class AppController extends Controller{
public $helpers = array('Text','Form','Html','Session');
public $components = array('Session','Auth');
function beforeFilter(){
$this->Auth->loginAction = array('controller'=>'users','action'=>'login','admin'=>false);
$this->Auth->authorize = array('Controller');
if(!isset($this->request->params'prefix'])){
$this->Auth->allow();
}
if(isset($this->request->params'prefix']) && $this->request->params'prefix'] == 'admin'){
$this->layout = 'admin';
}
}
}
UsersController
<?php
class UsersController extends AppController{
function login(){
if($this->request->is('post')){
if($this->Auth->login()){
return $this->redirect($this->Auth->redirect());
}else{
$this->Session->setFlash("Votre login ou votre mot de passe ne correspond pas","notif",array('type'=>'error'));
}
}
}
function logout(){
}
}
et la vue login.ctp
<h1>Se connecter</h1>
<?php echo $this->Form->create('User'); ?>
<?php echo $this->Form->input('username',array('label'=>"Login")); ?>
<?php echo $this->Form->input('password',array('label'=>"Mot de passe")); ?>
<?php echo $this->Form->end('Se connecter'); ?>
Lorsque je veux me connecter le "sql_dump" me renvoi :
SELECT User
.id
, User
.username
, User
.password
, User
.role
FROM tuto
.users
AS User
WHERE User
.username
= 'admin' LIMIT 1
On voit qu'il n'y a pas affiché le "AND 'User'.'password' = 'admin' ... après le WHERE User
.username
= 'admin'.
(Je sais aussi que mon MDP devrait etre crypté mais il faut que je rajoute la fonction dans un Model, je verrai ceci après de façon à pas tout melanger...)
Merci pour votre aide !
Alors le système est bouclé. Je ne sais pas si c'est parfait mais cela fonctionne.
Donc mes pages :
<?php
class AppController extends Controller{
public $helpers = array('Text','Form','Html','Session');
public $components = array(
'Auth' => array('authorize' => 'Controller'),
);
function beforeFilter(){
$this->Auth->loginAction = array('controller'=>'users','action'=>'login','admin'=>false);
$this->Auth->authorize = array('Controller');
if(!isset($this->request->params'prefix'])){
$this->Auth->allow();
}
if(isset($this->request->params'prefix']) && $this->request->params'prefix'] == 'admin'){
$this->layout = 'admin';
}
}
function isAuthorized($user = null) {
// Chacun des utilisateur enregistré peut accéder aux fonctions publiques
if (empty($this->request->params'admin'])) {
return true;
}
// Seulement les administrateurs peuvent accéder aux fonctions d'administration
if (isset($this->request->params'admin'])) {
return (bool)($user'role'] === 'admin');
}
// Par défaut n'autorise pas
return false;
}
}
<?php
class UsersController extends AppController{
function login(){
if($this->request->is('post')){
if($this->Auth->login()){
return $this->redirect('/admin/pages');
}else{
$this->Session->setFlash("Votre login ou votre mot de passe ne correspond pas","notif",array('type'=>'error'));
}
}
}
function logout(){
$this->Auth->logout();
$this->redirect('/');
}
function admin_index(){
$d'users'] = $this->Paginate('User');
$this->set($d);
}
function admin_delete($id){
$this->User->delete($id);
$this->Session->setFlash("L'utilisateur a bien été supprimé","notif");
$this->redirect($this->referer());
}
function admin_edit($id=null){
if($this->request->is('post') || $this->request->is('put') ){
$d = $this->request->data'User'];
if($d'password'] != $d'passwordconfirm']){
$this->Session->setFlash("Les mots de passes ne correspondent pas","notif",array('type'=>'error'));
}else{
if(empty($d'password']))
unset($d'password']);
if($this->User->save($d)){
$this->Session->setFlash("L'utilisateur a bien été enregistré","notif");
}
}
}elseif($id){
$this->User->id = $id;
$this->request->data = $this->User->read('username,role,id');
}
$d = array();
$d'roles'] = array(
'admin' => 'admin',
'user' => 'membre'
);
$this->set($d);
}
}
<?php
App::uses('SimplePasswordHasher', 'Controller/Component/Auth');
class User extends AppModel {
public function beforeSave($options = array()) {
if (!$this->id || $this->id) {
$passwordHasher = new SimplePasswordHasher();
$this->data'User']'password'] = $passwordHasher->hash(
$this->data'User']'password']
);
}
return true;
}
}
<h1>Editer un utilisateur</h1>
</div>
<?php echo $this->Form->create('User'); ?>
<?php echo $this->Form->input('username',array('label'=>'Login')); ?>
<?php echo $this->Form->input('password',array('label'=>'Mot de passe')); ?>
<?php echo $this->Form->input('passwordconfirm',array('label'=>'Confirmer mot de passe','type'=>'password')); ?>
<?php echo $this->Form->input('role',array('label'=>"Role")); ?>
<?php echo $this->Form->input('id'); ?>
<?php echo $this->Form->end('Envoyer'); ?>
<h1>Se connecter</h1>
<?php echo $this->Form->create('User'); ?>
<?php echo $this->Form->input('username',array('label'=>"Login")); ?>
<?php echo $this->Form->input('password',array('label'=>"Mot de passe")); ?>
<?php echo $this->Form->end('Se connecter'); ?>
Voilà en espérant en avoir aidé car a priori c'est un problème récurent !
Bonjour.
Il est normal qu'il ne puisse pas te connecter étant donné qu'il attend un retour du mot de passe crypté.
Un conseil, passes tes paramètres de système d'authentification directement dans le composant Auth, comme ceci par exemple :
public $components = array(
'Session',
'Auth' => array(
'loginAction' => array('controller' => 'users', 'action' => 'login', 'admin' => false),
'loginRedirect' => array('controller' => 'pages', 'action' => 'index', 'admin' => false),
'authenticate' => array('Form'),
'authorize' => array('Controller')
)
);
Pour information, $this->Auth->redirect() est obsolète depuis la version 2.3 de CakePHP, il faut à présent utiliser $this->Auth->loginRedirect().
Pour ce qui est d'encrypter le mot de passe, tu n'as pas besoin de faire une fonction quelconque dans ton modèle, il te suffit de le faire dans ta fonction d'enregistrement d'utilisateur avec :
$this->request->data'User']'password'] = $this->Auth->password($this->request->data'User']'password']);
ou alors si tu définies les données pour ton save
$save = array(
'username' => $this->request->data'User']'username'],
'password' => $this->Auth->password($this->request->data'User']'password']),
'email' => $this->request->data'User']'mail']
/* etc ... */);
$this->User->create();
if($this->User->save($save)){
/* ... */
} else {
/* ... */
}
Merci infiniment pour l'aide !
Je n'en suis pas encore à la sauvegarde d'utilisateur, c'est à ce moment là que je comptais voir pour l'encryptage. Mais je garde ta formule évidemment !
Pour ce qu est de l'appel du mot de passe crypté comment faire car dans ma bdd j'ai un mdp non crypté ?
j'ai passé tes paramètres de système d'authentification directement dans le composant Auth comme tu me l'as conseillé et donc cela ne marche pas ? AU vu du mdp non crypté je suppose ?
Il faudrait donc que je crée la fonction save avant de passer au login non ?
Merci pour l'aide !
Je suis donc passé par la fonction "edit" avec le hashage en beforesave mon mot de passe est bien hashé/crypté dans ma bdd. Maintenant je veux me connecter, je crois que sa marche car je suis renvoyé à admin/pages comme je lui ai demandé mais.... j'ai l'erreur :
$controller does not implement an isAuthorized() method.
Error: An Internal Error Has Occurred.
Je vous remet mes pages...
<?php
class AppController extends Controller{
public $helpers = array('Text','Form','Html','Session');
public $components = array(
'Session',
'Auth' => array(
'loginAction' => array('controller' => 'users', 'action' => 'login', 'admin' => false),
'loginRedirect' => array('controller' => 'pages', 'action' => 'index', 'admin' => false),
'authenticate' => array('Form'),
'authorize' => array('Controller'),
)
);
function beforeFilter(){
$this->Auth->loginAction = array('controller'=>'users','action'=>'login','admin'=>false);
$this->Auth->authorize = array('Controller');
if(!isset($this->request->params'prefix'])){
$this->Auth->allow();
}
if(isset($this->request->params'prefix']) && $this->request->params'prefix'] == 'admin'){
$this->layout = 'admin';
}
}
}
function isAuthorized($user){
if(!isset($this->request->params'prefix'])){
return true;
}
$roles = array(
'admin' => 10,
'user' => 5
);
if(isset($roles$this->request->params'prefix']])){
$lvlAction = $roles$this->request->params'prefix']];
$lvlUser = $roles$user'role']];
if($lvlUser >= $lvlAction){
return true;
}else{
return false;
}
}
return false;
}
<?php
class UsersController extends AppController{
function login(){
if($this->request->is('post')){
if($this->Auth->login()){
return $this->redirect('/admin/pages');
}else{
$this->Session->setFlash("Votre login ou votre mot de passe ne correspond pas","notif",array('type'=>'error'));
}
}
}
function logout(){
}
function edit($id=null){
if($this->request->is('post') || $this->request->is('put') ){
$d = $this->request->data'User'];
if($d'password'] != $d'passwordconfirm']){
$this->Session->setFlash("Les mots de passes ne correspondent pas","notif",array('type'=>'error'));
}else{
if(empty($d'password']))
unset($d'password']);
if($this->User->save($d)){
$this->Session->setFlash("L'utilisateur a bien été enregistré","notif");
}
}
}elseif($id){
$this->User->id = $id;
$this->request->data = $this->User->read('username,role,id');
}
$d = array();
$d'roles'] = array(
'admin' => 'admin',
'user' => 'membre'
);
$this->set($d);
}
}
<?php
App::uses('SimplePasswordHasher', 'Controller/Component/Auth');
class User extends AppModel {
public function beforeSave($options = array()) {
if (!$this->id) {
$passwordHasher = new SimplePasswordHasher();
$this->data'User']'password'] = $passwordHasher->hash(
$this->data'User']'password']
);
}
return true;
}
}
Page login
<h1>Se connecter</h1>
<?php echo $this->Form->create('User'); ?>
<?php echo $this->Form->input('username',array('label'=>"Login")); ?>
<?php echo $this->Form->input('password',array('label'=>"Mot de passe")); ?>
<?php echo $this->Form->end('Se connecter'); ?>
Page edit
<h1>Editer un utilisateur</h1>
</div>
<?php echo $this->Form->create('User'); ?>
<?php echo $this->Form->input('username',array('label'=>'Login')); ?>
<?php echo $this->Form->input('password',array('label'=>'Mot de passe')); ?>
<?php echo $this->Form->input('passwordconfirm',array('label'=>'Confirmer mot de passe','type'=>'password')); ?>
<?php echo $this->Form->input('role',array('label'=>"Role")); ?>
<?php echo $this->Form->input('id'); ?>
<?php echo $this->Form->end('Envoyer'); ?>
J'avais eu exactement le même problème et je n'ai pas su le résoudre malgré l'aide du forum. :/
Depuis que j'ai recréé un projet et que je suis partie sur des bases saines avec CakePHP 2.4.5 je n'ai plus ce problème...
Pourtant on a sensiblement le même code dans ton action login().
a priori j'ai reussi grace à l'aide de "Lartak11" et plusieurs topic + le book cakephp! j'ai encore un problème de hashage, lorsque j'ajoute un nouvel admin le mdp est hashé mais si je modifie le mdp il ne l'est pas.. c'est donc dans mon before save. J'attend de tout boucler pour mettre en résolu et mettre mes codes réussi :)