domingo, 22 de febrero de 2015

Yii Framework 2 - User y Admin (Control de acceso de usuarios)




En este capítulo continuamos con la autenticación de usuarios y vamos a ver como crear controles de acceso para los usuarios registrados, el ejemplo consistirá en crear 2 roles, uno para usuarios registrados simples y otro para administradores, los usuarios simples tendrán acceso a determinadas secciones de la web y los administradores a otras, como ejemplo crearemos dos páginas, una reservada para los usuarios registrados simples y otra para los administradores, tras iniciar sesión se determinará su rol en el sistema y serán redireccionados a la página de user o admin dependiendo del rol asignado al usuario.

Para esta tarea agregaremos una nueva columna a la tabla users llamada role, por defecto esta columna tendrá el valor 1 que es el rol de los usuarios simples, el valor 2 asignará al usuario privilegios de administrador.

yii\filters\AccessControl: http://www.yiiframework.com/doc-2.0/yii-filters-accesscontrol.html

Guía del capítulo:

1 - Agregar la columna role a la tabla users ...

ALTER TABLE `users` ADD `role` INT NOT NULL DEFAULT '1';


2 - Crear los métodos isUserAdmin y isUserSimple en el modelo User.php que nos permitirán establecer los permisos de usuario, estos métodos regresarán un valor boolean, también tenemos que agregar la nueva propiedad $role ...

    public $role;

    public static function isUserAdmin($id)
    {
       if (Users::findOne(['id' => $id, 'activate' => '1', 'role' => 2])){
        return true;
       } else {

        return false;
       }

    }

    public static function isUserSimple($id)
    {
       if (Users::findOne(['id' => $id, 'activate' => '1', 'role' => 1])){
       return true;
       } else {

       return false;
       }
    }


3 - Agregar la clase User al controlador SiteController.php para poder utilizar los métodos creados anteriormente ...

use app\models\User;


4 - Crear las acciones-vistas User y Admin para poder ver el ejemplo de control acceso de usuarios.

5 - Configurar el control de acceso de usuarios en el método behaviors que se encuentra en el controlador SiteController.php ...

    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['logout', 'user', 'admin'],
                'rules' => [
                    [
                        //El administrador tiene permisos sobre las siguientes acciones
                        'actions' => ['logout', 'admin'],
                        //Esta propiedad establece que tiene permisos
                        'allow' => true,
                        //Usuarios autenticados, el signo ? es para invitados
                        'roles' => ['@'],
                        //Este método nos permite crear un filtro sobre la identidad del usuario
                        //y así establecer si tiene permisos o no
                        'matchCallback' => function ($rule, $action) {
                            //Llamada al método que comprueba si es un administrador
                            return User::isUserAdmin(Yii::$app->user->identity->id);
                        },
                    ],
                    [
                       //Los usuarios simples tienen permisos sobre las siguientes acciones
                       'actions' => ['logout', 'user'],
                       //Esta propiedad establece que tiene permisos
                       'allow' => true,
                       //Usuarios autenticados, el signo ? es para invitados
                       'roles' => ['@'],
                       //Este método nos permite crear un filtro sobre la identidad del usuario
                       //y así establecer si tiene permisos o no
                       'matchCallback' => function ($rule, $action) {
                          //Llamada al método que comprueba si es un usuario simple
                          return User::isUserSimple(Yii::$app->user->identity->id);
                      },
                   ],
                ],
            ],
     //Controla el modo en que se accede a las acciones, en este ejemplo a la acción logout
     //sólo se puede acceder a través del método post
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'logout' => ['post'],
                ],
            ],
        ];
    }


6 - Modificar la acción Login para establecer las redirecciones dependiendo del rol que tenga el usuario ...

    public function actionLogin()
    {
        if (!\Yii::$app->user->isGuest) {
   
   if (User::isUserAdmin(Yii::$app->user->identity->id))
   {
    return $this->redirect(["site/admin"]);
   }
   else
   {
    return $this->redirect(["site/user"]);
   }
        }
 
        $model = new LoginForm();
        if ($model->load(Yii::$app->request->post()) && $model->login()) {
   
            if (User::isUserAdmin(Yii::$app->user->identity->id))
   {
    return $this->redirect(["site/admin"]);
   }
   else
   {
    return $this->redirect(["site/user"]);
   }
   
        } else {
            return $this->render('login', [
                'model' => $model,
            ]);
        }
    }


Ver el vídeo tutorial de Yii Framework 2 en Youtube




1 comentario:

Mauro Blim dijo...

hola, tengo una duda, como hago para mostrar los menus segun el rol que esté autenticado. saludos