.: HosiriS :.

Informatica e non solo

Utenti, Gruppi e Permessi con CakePHP

Posted by hosiris su settembre 19, 2011

In questo post vedremo come realizzare un sistema di autorizzazioni per l’accesso al nostro sito.

Iniziamo col creare il nostro database:


CREATE TABLE users (
    id int (11) NOT NULL auto_increment,
    firstname varchar (50) NOT NULL,
    lastname varchar (50) NOT NULL,
    birthdate date NOT NULL,
    email_address varchar (50) NOT NULL,
    password varchar (50) NOT NULL,
    active tinyint(1) NOT NULL,
    created datetime NOT NULL,
    modified datetime NOT NULL,
    PRIMARY KEY (id)
);
CREATE TABLE groups (
    id int(11) NOT NULL auto_increment,
    name varchar(50) NOT NULL,
    created datetime NOT NULL,
    modified datetime NOT NULL,
    PRIMARY KEY (id)
);
CREATE TABLE permissions (
    id int(11) NOT NULL auto_increment,
    name varchar(50) NOT NULL,
    created datetime NOT NULL,
    modified datetime NOT NULL,
    PRIMARY KEY (id)
);
CREATE TABLE groups_users(
    group_id int(11) NOT NULL,
    user_id int(11) NOT NULL
);
CREATE TABLE groups_permissions(
    group_id int(11) NOT NULL,
    permission_id int(11) NOT NULL
);

Passiamo alla scrittura dei models.


//app/models/user.php
class User extends AppModel {
    var $displayField = 'email_address';
    var $name = 'User';
    var $useTable = 'users';
    var $validate = array(
        'email_address' => array('email'),
        'password' => array('alphaNumeric'),
        'active' => array('numeric')
    );
    var $hasAndBelongsToMany = array(
            'Group' => array('className' => 'Group',
                        'joinTable' => 'groups_users',
                        'foreignKey' => 'user_id',
                        'associationForeignKey' => 'group_id',
                        'unique' => true
            )
    );
}

//app/models/group.php
class Group extends AppModel {
    var $name = 'Group';
    var $useTable = 'groups';
    var $hasAndBelongsToMany = array(
            'Permission' => array('className' => 'Permission',
                        'joinTable' => 'groups_permissions',
                        'foreignKey' => 'group_id',
                        'associationForeignKey' => 'permission_id',
                        'unique' => true
            ),
            'User' => array('className' => 'User',
                        'joinTable' => 'groups_users',
                        'foreignKey' => 'group_id',
                        'associationForeignKey' => 'user_id',
                        'unique' => true
            )
    );
}

//app/models/permission.php
class Permission extends AppModel {
    var $name = 'Permission';
    var $useTable = 'permissions';
    var $hasAndBelongsToMany = array(
            'Group' => array('className' => 'Group',
                        'joinTable' => 'groups_permissions',
                        'foreignKey' => 'permission_id',
                        'associationForeignKey' => 'group_id',
                        'unique' => true
            )
    );
}

Terminata la parte relatica ai models, scriviamo i controller relativi:


//app/controllers/users_controller.php
class UsersController extends AppController {
    var $name = 'Users';
    var $scaffold;
    function login(){}
    function logout(){
        $this->redirect($this->Auth->logout());
    }
}

//app/controllers/groups_controller.php
class GroupsController extends AppController {
    var $name = 'Groups';
    var $scaffold;
}

//app/controllers/permissions_controller.php
class PermissionsController extends AppController {
    var $name = 'Permissions';
    var $scaffold;
}

Creiamo un file app_controller.php, se già non lo avete, e scriviamo:


//app/app_controller.php
class AppController extends Controller {
    var $admin = array();
    var $allowedActions = null;
    var $components = array('Auth');
    function beforeFilter(){
        $this->Auth->fields = array('username'=>'email_address','password'=>'password');
        $this->Auth->allow('*');
        $this->Auth->logoutRedirect = '/';
        $this->Auth->loginRedirect = '/';
        $this->Auth->authorize = 'controller';
        $this->Auth->userScope = array('User.active = 1');
        $this->set('Auth',$this->Auth->user());
    }
    function beforeRender(){
        if($this->Auth->user()){
            $controllerList = Configure::listObjects('controller');
            foreach($controllerList as $controllerItem){
                if($controllerItem  'App'){
                    if($this->__permitted($controllerItem,'index')){
                        $this->admin[] = $controllerItem;
                    }
                }
            }
        }
        $this->set('admin',$this->admin);

    }
    function isAuthorized(){
        return $this->__permitted($this->name,$this->action);
    }
    function __permitted($thisController,$thisAction){
        $thisController = low($thisController);
        $thisAction = low($thisAction);
        if($thisController.':'.$thisAction == 'users:logout'){
            return true;
        }
        if(!$this->allowedActions){
            App::import('Model', 'User');
            $thisUser = new User;
            $thisGroups = $thisUser->find(array('User.id'=>$this->Auth->user('id')));
            $thisGroups = $thisGroups['Group'];
            foreach($thisGroups as $thisGroup){
                $thisPermissions = $thisUser->Group->find(array('Group.id'=>$thisGroup['id']));
                $thisPermissions = $thisPermissions['Permission'];
                foreach($thisPermissions as $thisPermission){
                    $this->allowedActions[]=$thisPermission['name'];
                }
            }
        }
        foreach($this->allowedActions as $allowedAction){
            if($allowedAction == '*'){
                return true;
            }
            if($allowedAction == $thisController.':'.$thisAction){
                return true;
            }
        }
        return false;
    }
}

Per finire creiamo la vista per la pagina di login, siccome abbiamo usato la variabile scaffold non sarà necessario creare anche le altre viste:


//app/views/users/login.ctp
echo $form->create('User', array('action' => 'login'));
echo $form->input('email_address',array('between'=>'
','class'=>'text'));
echo $form->input('password',array('between'=>'
','class'=>'text'));
echo $form->end('Sign In');

Cominciamo con il rendere funzionante il sistema.
Notiamo che al momento sono permesse tutte le azioni, quindi possiamo accedere a http://localhost/permissions e aggiungere un permesso di nome ‘*’.
Terminato, possiamo creare un gruppo clickando su New Group ed inserendo ‘Admin’ come name e selezionando * come permesso.
Infine inseriamo l’utente a cui associeremo il gruppo appena creato e ricordando di mettere un check sul campo ‘activate’.

Adesso facciamo la seguente modifica in app_controller.php:


//da
    $this->Auth->allow('*');
//a
    $this->Auth->allow('display');

Buon divertimento!

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

 
%d blogger cliccano Mi Piace per questo: