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