Bonjour,
Je viens de faire un système d'authentification avec 3 roles différents donc 3 préfix défferents aussi : membre, manager, admin.
Le problème est que quand je suis connecté en mode admin, je peux acceder à l'interface utilisateur car l'administrateur a un niveau plus haut que l'utilisateur membre et je ne veux pas que l'admin accède à l'interfaces des autres utilisateur avec un niveau plus bas.
Je vous mets le code de ma function Isauthorized dans mon appcontrolleur.php :

nction isAuthorized($user){
        if(!isset($this->request->params['prefix'])){
            return true;
        }
        $roles = array(
            'admin' => 15,
            'manager' => 10,
            'membre'  => 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;
    }

Merci d'avance !

6 réponses


Lartak
Réponse acceptée

Tu pourrais par exemple faire quelque chose comme ça :

public function isAuthorized($user){
    if (!isset($this->request->params['prefix'])){
        return true;
    }
    return $this->request->params['prefix'] == $user['role'];
}
arcoss 3x
Auteur
Réponse acceptée

Merci de votre aide !!! J'ai enfin réussis !! Je mets le code en cas de besoin.

function isAuthorized($user){
        if(!isset($this->request->params['prefix'])){
            return true;
        }
        if($user['role'] == 'admin' && isset($this->request->params['prefix']) && $this->request->params['prefix'] == 'membre' || $this->request->params['prefix'] == 'manager'){
            $this->redirect('/users/logout/');
        }else{
            return $this->request->params['prefix'] == $user['role'];
        }
        if($user['role'] == 'manager' && isset($this->request->params['prefix']) && $this->request->params['prefix'] == 'membre' || $this->request->params['prefix'] == 'admin'){
            $this->redirect('/users/logout/');
        }else{
            return $this->request->params['prefix'] == $user['role'];
        }
        if($user['role'] == 'membre' && isset($this->request->params['prefix']) && $this->request->params['prefix'] == 'admin' || $this->request->params['prefix'] == 'manager'){
            $this->redirect('/users/logout/');
        }else{
            return $this->request->params['prefix'] == $user['role'];
        }
    }       

Bonjour.
Si tu ne veux pas utiliser un système de rôle avec niveau, il te suffit de n'autoriser l'utilisateur que sur les fonctions dont le prefix correspond à son rôle.

J'ai enlever ce qu'il fallait et ca ne marche pas ... Je te mets mon appcontroller.php en entier :

<?php
App::uses('Controller', 'Controller');
class AppController extends Controller{

    public $helpers = array('Text','Form','Html','Session','Cache');
    public $components = array('Session','Cookie',
        'Auth' => array(
            'authenticate' => array(
                'Form' => array(
                    'scope' => array('User.active' => 1)
                )
            )
        )
    );

    function beforeFilter(){

        $this->Auth->loginAction = array('controller'=>'users','action'=>'login','admin'=>false,'user'=>false,'superadmin'=>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';
        }
        if(isset($this->request->params['prefix']) && $this->request->params['prefix'] == 'user'){
            $this->layout = 'user';
        }
    }

    function isAuthorized($user){
        if(!isset($this->request->params['prefix'])){
            return true;
        }
        return false;
    }
}

Merci

Merci ta solution fonctionne !!! Mais le problème restant c'est que quand il refuse l'accès à admin pour aller vers l'espace membre, il me redirige vers / et je voudrai qu'il me redirige vers /users/login ...

quand il refuse l'accès à admin pour aller vers l'espace membre, il me redirige vers / et je voudrai qu'il me redirige vers /users/login

Si l'utilisateur est connecté, il ne va pas faire la redirection vers l'action d'identification.
Donc à toi de faire en sorte par exemple de déconnecter l'utilisateur s'il essait d'accéder à une action qui ne lui est pas permise.
Je veux bien t'aider en te donnant des pistes ou accessoirement un peu de code, mais je ne vais pas te donner la réponse toute faite à chaque fois.