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:
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:
hola, tengo una duda, como hago para mostrar los menus segun el rol que esté autenticado. saludos
Publicar un comentario