Checking user role on login using CakePHP?

Muhammad Umair picture Muhammad Umair · Jan 18, 2013 · Viewed 9.8k times · Source

I want to create an admin panel for my site, for this I've created admin.ctp. In DB table name user contain column role, where role=admin/regular(user).

There is only one login form, and the question is, Is it possible to place a 'check' that if user.role=admin then redirect to the admin/user/dashboard and if user.role=regular then layout=default? my AppController.php contains:

function beforeFilter(){
    $this->Auth->allow('index','view','login','home');
    $this->set('admin',$this->_isAdmin());

    $this->set('logged_in',$this->Auth->loggedIn());
    $this->set('current_user',$this->Auth->User());
    if ((isset($this->params['prefix']) && ($this->params['prefix'] == 'admin'))) {
        $this->layout = 'admin';
    }

And usersController.php

function beforeFilter(){
    parent::beforeFilter();
    $this->Auth->allow('*');
    if($this->action=='add' || $this->action=='edit'){
        $this->Auth->authenticate=$this->User;
    }
}

function login(){
    if(!($this->Auth->loggedIn())){
        if ($this->request->is('post')) {
            if ($this->Auth->login()) {
                if($user['role'] === 'admin'){
                    $this->redirect($this->Auth->redirect('admin',array('controller' => 'user','action' => 'admin_dashboard')));
                }
                $this->redirect($this->Auth->redirect(array('controller' => 'posts','action' => 'index')));
            } else {
                $this->Session->setFlash('Your username/password combination was incorrect.',
                    'alert',array(
                        'plugin' => 'TwitterBootstrap',
                        'class' => 'alert-error'
                    ));
                $this->set('forget', 'Forgot Your Password');

            }
        }
    }else
    {
        $this->redirect($this->Auth->redirect(array('controller' => 'posts','action' => 'index')));
    }
}

using cakephp 2.2.3. thanks in advance!

Answer

Yoggi picture Yoggi · Jan 18, 2013

This is how I would do it (remember to change field('name') accordingly with your group model).

if ($this->Auth->login())
{
    this->User->Group->id = $this->Auth->user('group_id');
    switch ($this->User->Group->field('name'))
    {
        case 'admin':
            $this->redirect($this->Auth->redirect('admin',array('controller' => 'user','action' => 'admin_dashboard')));
            break;
        case 'regular':
            $this->redirect($this->Auth->redirect(array('controller' => 'posts','action' => 'index')));
            break;
        default:
            //...
            break;
    }
}