Bonjour,
j'ai un petit soucis avec une application cakephp ! au niveau de l'autorisation de certaines de mes actions sur les controlleurs !
je pense que c'est du à la modification du champ username par email à l'authentification dans l'appcontroller !
public $components = array(
'Paginator',
'Session',
'Cookie',
'Auth' => array(
'authenticate' => array(
'Form' => array(
'User.scope' => array('User.active'=>1),
'fields' => array('username' => 'mail','password'=>'pass')
)
)
));
Donc quand je fais dans mon controller
public function beforeFilter(){
parent::beforeFilter();
$this->Auth->allow('show','search','featured','index');
}
me redirige systématiquement vers la page de connexion ! j'ai pas trouvé le bug !
Bonsoir.
Est-ce que la connexion de l'utilisateur s'effectue bien ?
Fais-tu une redirection dans l'action login vu que tu n'as pas spécifié de redirection dans le composant d'authentification ?
Oui la connexion s'effectue normalement
ma fonction login
public function login(){
if (!empty($this->request->data)) {
if ($this->Auth->login()) {
if ($this->Auth->user('role')=='admin') {
$this->redirect(array('action'=>'index','controller'=>'Administration','admin'=>true));
}
else{
$this->redirect(array('action'=>'index','controller'=>'pages'));
}
$this->Session->setFlash(__("You are now connected"),"flash", array('class' => 'success'));
}else{
$this->Session->setFlash(__("password or login not correct"),"flash", array('class' => 'danger'));
}
}
}
mais en mode non connecté ya des action que j'aimerai rendre publique sauf que ça marche pas !
Bonjour.
Fais comme ceci dans ton AppController :
public $components = array(
'Paginator',
'Session',
'Cookie',
'Auth' => array(
'authenticate' => array(
'Form' => array(
'User.scope' => array('User.active'=>1),
'fields' => array('username' => 'mail','password'=>'pass')
),
'authorize' => array('Controller') // Ligne ajoutée
)
)
);
public function isAuthorized($user) {
// Admin peut accéder à toute action
if (isset($user'role']) && $user'role'] === 'admin') {
return true;
}
// Refus par défaut
return false;
}
Puis dans le controller concerné :
public function isAuthorized($user){
parent::isAuthorized();
$this->Auth->allow('show','search','featured','index');
}
Cela devrait corriger le problème, par contre penses à mettre le isAuthorized et les actions que tu autorises dans les autres controller, notamment dans UsersController pour les actions de login et d'inscriptions, ainsi que d'autres pour les pages "publiques".
Merci pour la réponse mais rien n'y fait toujours rediriger vers users/login
je mets en entier mon controller au cas ou
<?php
App::uses('Controller', 'Controller');
class AppController extends Controller {
public $helpers = array('Html','Form','Media.Media','Text','Image.Image');
public $components = array(
'Paginator',
'Session',
'Cookie',
'Auth' => array(
'authenticate' => array(
'Form' => array(
'User.scope' => array('User.active'=>1),
'fields' => array('username' => 'mail','password'=>'pass')
)
),
'authorize' => array('controller')
)
);
public function isAuthorized($user) {
// Admin peut accéder à toute action
if (isset($user'role']) && $user'role'] === 'admin') {
return true;
}
// Refus par défaut
return false;
}
public function beforeFilter(){
if(isset($this->request->params'prefix']) && $this->request->params'prefix'] === 'admin'){
$this->layout = 'admin';
}
if ($this->Session->read('Auth.User.id')&&!$this->Session->read('Auth.Subscription')) {
$this->loadModel('Subscription');
$subscriptions = $this->Subscription->find('list',array(
'fields' => array('job_id','job_id'),
'conditions' => array('user_id'=>$this->Auth->user('id'))
));
$this->Session->write('Auth.Subscription',$subscriptions);
}
}
}
Dans ta vue, tu a bien nommer ton champs "email" ou "mail" ?
Essayer en rajoutant dans fields, l'alias "User".
'Auth' => array(
'authenticate' => array(
'Form' => array(
'User.scope' => array('User.active'=>1),
'fields' => array('User.username' => 'mail','User.password'=>'pass')
)
)
)
ça ne change pas le probleme toujours rediriger vers la page de connexion ! c'est fou !
Dans la bdd as tu le champs active à true ?
Je ne sais pas toi mais moi ça me gene un peu ton
$this->Auth->allow('show','search','featured','index');
xD
J'aurai plutot fait
$this->Auth->allow(array('index','show','search','featured'));
j'ai bien un champ active booleen! mais là mon probleme j'ai des fonctions qu'un utilisateur non connecté doit pouvoir voir et il me renvoi systématiquement sur la page de connexion !
YO.
Rajouter ceci au niveau du beforeFilter:
if(isset($this->request->params'prefix']) && $this->request->params'prefix'] === 'admin'){
$this->layout = 'admin';
}
else {
$this->Auth->allow();
}
...
Et c'est 'scope' seulement. (non pas 'User.scope')
C'est vrai que je n'avais pas fait gaffe au User.scope au lieu du scope , scope est une clé et non un nom de champ.
Ça expliquerait le problème, en effet, sauf qu'il dit que la connexion s'effectue bien, ce qui est étonnant.
@ndiayejp : je ne sais pas si tu as mis le plugin DebugKit , mais ça devrait pouvoir t'aider, ça évite de faire des vérifications manuelles et probablement te permettre de trouver le problème plus rapidement.
@PhisyX : D'après son code il ne veut pas limiter les actions uniquement par les prefix, il ne semble pas vouloir utiliser le prefixage pour les utilisateurs enregistrés, juste le système d'autorisation via les controller pour les actions, donc ce que tu proposes en dernier ne lui sera pas utile.
Tu peux rapidement voir tout ce qui est Session, Request, Cookie, les erreurs, les paramètres, les requètes, les logs Sql, etc.
Tout ce qui peut être utile pour le développement de l'application.
Oups, en effet! J'ai pas tout lu. *Se tape le front*
Si j'ai bien compris, c'est ce que tu veux faire => vidéo ?
Bonjour,
Essaie de mettre cette fonction dans le controller concerné.
public function isAuthorized($user){
return true;
}
A mon avis tu ferais mieux de supprimer l'autorisation aux pages sur chaque controller en supprimant cette ligne :
'authorize' => array('Controller') // Ligne ajoutée
@ndiayejp: dans la vidéo, j'ai juste repris les codes qui ont été mis ici.
J'ai repris le code qu'a proposé Lartak11, pour l'AppCtrl.
Puis j'ai rajouté les beforeFilter's dans les controllers PagesCtrl et UsersCtrl.
PagesCtrl : que tu as déjà fait ( $this->Auth->allow(array('action1', 'action2')) )
UsersCtrl :
public function beforeFilter()
{
parent::beforeFilter();
// Connecté ou non
$allow = array('disconnect');
// Non connecté
if (!$this->Auth->user('id')) {
array_push($allow, 'index', 'connect', 'login', 'etc...');
}
$this->Auth->allow($allow);
}
Voilà.
Sinon as-tu le message "You are not authorized to access that location." lorsque tu es redirigé vers ta page de connexion?