Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP

Cómo programar con Yii2: Controles de acceso a usuarios

by
Read Time:10 minsLanguages:
This post is part of a series called How to Program With Yii2.
How to Program With Yii2: Localization With I18n
How to Program With Yii2: Rich Text Input With Redactor

Spanish (Español) translation by Elías Nicolás (you can also view the original English article)

Final product imageFinal product imageFinal product image
What You'll Be Creating

Si usted está preguntando, "¿Qué es Yii?" Echa un vistazo a mi tutorial anterior: Introducción a Yii Framework, que revisa los beneficios de Yii e incluye una visión general de lo que es nuevo en Yii 2.0, publicado en octubre de 2014.

En la serie programación con Yii2, estoy guiando a los lectores en el uso de la nueva actualización de Yii2 Framework para PHP.

En la primera parte, configuramos Yii2 localmente, construimos una aplicación Hello World, configuramos un servidor remoto y utilizamos Github para desplegar nuestro código. En la segunda parte, aprendimos sobre la implementación de Yii de su arquitectura Model View Controller y cómo construir páginas web y formularios que recopilen y validen datos.

En la tercera parte, utilizamos la base de datos de Yii y las capacidades de registro activo para automatizar la generación de código para una aplicación web básica. En la parte cuatro aprendimos cómo integrar el registro de usuarios. Y en la quinta parte, exploramos la localización con I18n para preparar su aplicación para usuarios globales.

En este tutorial, voy a mostrarte cómo implementar controles de acceso para asegurar que sólo los usuarios adecuados puedan acceder a las partes de nuestra aplicación que deseamos.

Para estos ejemplos, seguiremos imaginando que estamos construyendo un marco para publicar actualizaciones de estado simples, p. Nuestro propio mini-Twitter.

Sólo un recordatorio, yo sí participar en los comentarios de los temas a continuación. Estoy especialmente interesado si tiene diferentes enfoques, ideas adicionales o desea sugerir temas para futuros tutoriales.

¿Qué es el control de acceso?

El control de acceso se integra con las características de autenticación del marco para permitir o restringir el acceso a características o páginas específicas de su sitio web.

Por ejemplo, en nuestra aplicación de ejemplo, puede visitar la página Estado y publicar artículos sin iniciar sesión.

Podemos usar las sencillas funciones de control de acceso de Yii2 para asegurar que los usuarios se registren y se registren antes de agregar y ver publicaciones de estado.

Yii2 también ofrece un control de acceso basado en funciones (RBAC) más avanzado (y complejo) que no implementaremos en este momento. Con RBAC, define una jerarquía sofisticada de permisos para cada actividad posible dentro de su aplicación.

Yii2 construido en el control de acceso soporta sólo dos funciones por defecto: invitado (no conectado), representado por '?', Y autenticado, representado por '@'. Con controles de acceso simples, podemos limitar el acceso a páginas específicas o acciones de controlador basadas en el estado de inicio de sesión. Si los usuarios no están conectados cuando visitan las páginas de lugar, Yii los redirigirá a la página de inicio de sesión.

En este tutorial, te presentaré al usar los controles de acceso simples de Yii2 para nuestra aplicación de ejemplo. Luego ampliaremos el acceso simple con funciones adicionales como moderador y administrador.

Implementación de control de acceso Simple

Actualmente, nuestra aplicación permite el acceso al StatusController incluso sin iniciar sesión. Vamos a arreglar eso.

Status Controller Open access to anything regardless of login stateStatus Controller Open access to anything regardless of login stateStatus Controller Open access to anything regardless of login state

El marco facilita la implementación de estos controles. Simplemente añadimos comportamientos a StatusController.php que definen las reglas de acceso para cada acción, p. index, create, view, etc.

Aquí vamos a revisar el comportamiento de acceso, pero si estás interesado, los filtros de verbo de Yii te permiten restringir las operaciones de solicitud http basadas en la acción del controlador.

Una vez agregado, si hace clic en el menú Status, será redirigido a la página de inicio de sesión:

StatusController Redirect to Login Page with Access ControlStatusController Redirect to Login Page with Access ControlStatusController Redirect to Login Page with Access Control

Una vez agregado, si hace clic en el menú Estado, será redirigido a la página de inicio de sesión:...

Adición de propiedad de modelo

Ahora, cuando los usuarios acceden a las páginas de estado, podemos encontrar al usuario actual con este código:

Yii::$app->user->getId();

Y podemos asociar puestos de estado con su creador en el modelo.

Para ello, tenemos que ampliar la tabla de estado con una nueva migración de tabla:

Aquí está el código de migración que agrega una columna para created_by. También agregamos una clave externa para crear una relación entre el campo Status->created_by y la tabla User->id

Vamos a ejecutar la migración:

Volví a ejecutar la generación de código Gii con la nueva tabla de estado y copié y pegó los nuevos elementos adicionales. La mayoría eran menores pero notarás que agrega un nuevo ActiveQuery para la relación:

Por lo tanto, justo antes de guardar los nuevos elementos de estado, podemos actualizar el campo created_by al usuario actualmente conectado. Y podemos confiar en los controles de acceso para asegurarnos de que el método  create sea accedido únicamente por usuarios autenticados:

También ampliaremos el widget de vista para incluir el campo created_by:

Status Detail View Showing Created By User IdStatus Detail View Showing Created By User IdStatus Detail View Showing Created By User Id

También podemos usar la relación created_by para mostrar la dirección de correo electrónico:

El método createdBy.email accede al método de relación Status::getCreatedBy. Esto muestra la dirección de correo electrónico del usuario:

Sin embargo, con el fin de apoyar esta capacidad con la extensión Yii2-User que implementamos en la parte cuatro, tuvimos que hacer dos modificaciones. Primero, en nuestra matriz de configuración de app\config\web.php, agregamos un modelo de anulación a app\models\User.php:

También creamos este modelo en app\models:

Estos dos cambios proveen soporte para la relación.

Ampliación de control de acceso simple

¿Qué pasa si queremos tener capacidad adicional en torno a las acciones del controlador? Por ejemplo, ¿qué sucede si queremos restringir las operaciones de eliminación a moderadores o administradores? El control de acceso simple de Yii2 no tiene un concepto de moderador o administrador a menos que cree uno con RBAC.

Tenga en cuenta que la extensión de usuario Yii2 tiene un identificador de administrador para usuarios específicos, pero también carece de flexibilidad para funciones adicionales.

El Code Ninja escribió un buen ejemplo de extender controles de acceso simples para apoyar a moderadores y administradores (Simpler Role Based Authorization en Yii 2.0) sin tener que recurrir al uso de RBAC. Su ejemplo funciona con la plantilla de aplicación avanzada de Yii2.

Nuestra aplicación es diferente en que estamos utilizando la plantilla de aplicación básica de Yii y estamos utilizando la extensión de usuario Yii2. Por lo tanto, he hecho algunos cambios en su guía:

En primer lugar, creamos un directorio app\components y un archivo AccessRule.php que extiende el modelo de AccessRule incorporado de Yii:

A continuación, añadimos definiciones de roles a nuestro modelo de app\models\User:

Yii2-user no implementa la columna de función al crear nuevos usuarios. Por lo tanto, puede especificar roles para moderadores y administradores manualmente en MySQL o más tarde crear su propia interfaz de usuario web para otorgar roles.

En el vendor\dektrium\yii2-user\models\RegistrationForm.php, agregué esta línea para definir la función de usuario para los usuarios predeterminados:

Nota: tendrás que realizar este cambio manualmente si lo deseas porque mi directorio de proveedores no se registra en nuestro árbol de GitHub—y sí, probablemente hay una forma más elegante de hacerlo en la base de código central después de que se registre , p.ej Extender el método createUser en app/models/User.php. La mejor práctica es forjar el repositorio de proveedores y llevarlo a su propio árbol de código.

Finalmente, en StatusController.php, agregamos algunas bibliotecas y estas definiciones de acceso. En el ejemplo siguiente, las acciones de actualización están restringidas a los moderadores y las acciones de eliminación están restringidas a los administradores.

Ahora, al cerrar la sesión y visitar la página Status de la barra de navegación, aparecerá en la pantalla de inicio de sesión:

Login Access RestrictionLogin Access RestrictionLogin Access Restriction

Al iniciar sesión, volverá a enviarlo a la vista de índice:

Authenticated View of Status Index PageAuthenticated View of Status Index PageAuthenticated View of Status Index Page

Sin embargo, si hago clic en Delete, obtendré este error de acceso prohibido, porque soy un usuario humilde, no un administrador:

Access Forbidden Due to User RoleAccess Forbidden Due to User RoleAccess Forbidden Due to User Role

Si desea elevarse a administrador, puede hacerlo en la base de datos, cambiando la columna de función de la tabla de usuario para su user_id a 20 para moderador y 30 para admin. Pruebe las operaciones de actualización y eliminación de nuevo y se le permitirá dependiendo del papel que haya elegido.

Los controles de acceso son una de las muchas características que me convierten en un gran defensor del uso de Yii Framework. Yii me convierte en un desarrollador mucho más eficiente, capaz de ofrecer soluciones mucho más rápidamente de lo que puedo con PHP de vainilla.

¿Que sigue?

Vea los próximos tutoriales en mi serie Programación Con  Yii2 mientras continúo sumando diferentes aspectos del framework. También puede ver la serie construyendo su startup con PHP, que está utilizando la plantilla avanzada de Yii2 mientras que construyo una aplicación del mundo real.

Si quieres saber cuándo llega el próximo tutorial de Yii2, sígueme @reifman en Twitter o consulta mi página de instructor. Mi página de instructor incluirá todos los artículos de esta serie tan pronto como se publiquen. También puede enviarme un correo electrónico a mi sitio web de Lookahead Consulting.

Enlaces relacionados

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.