2012-03-07 9 views
10

En mi aplicación Yii, deseo que mi jerarquía de autorización y reglas comerciales se escriban en código y quiero que mis usuarios, roles y permisos se almacenen en la base de datos. Esto separa mi lógica comercial (que debería ser código) de la información que debería usar (que deberían ser datos). Parece que Yii no es compatible con esto.¿Cuál es el motivo para tener reglas de autorización en la base de datos?

En Yii tiene la opción de poner su lógica de negocio en archivos (CPhpAuthManager) o en la base de datos (CdbAuthManager). De cualquier manera, está tratando su lógica comercial como datos; Yii recuperará la lógica de su empresa como cadenas y luego la ejecutará a través de un eval, lo que parece una forma terrible de hacerlo.

¿Cuál es el motivo de esto?

¿Cómo puedo lograr el resultado que quiero?

Respuesta

2

Puede poner tanta lógica como desee en su código PHP para la lógica de su negocio. Yii admite muchas formas de agregar esta lógica, por ej. LoginForm.php, UserIdentity.php, SiteController.php, ... usted no está limitado aquí.

Lo que Yii también admite es agregar un fragmento de lógica a su RBAC. Un caso de uso común es que asigna las dos reglas 'Autenticadas' e 'Invitado' a todos los usuarios de su sitio de forma predeterminada, pero con bizRules. Mientras 'autenticado' tiene un BizRule como

return !Yii::app()->user->isGuest; 

'huéspedes' tiene

return Yii::app()->user->isGuest; 

El resultado es, que su revisión en línea los usuarios no están ya 'huéspedes', pero 'autenticado'. Otro ejemplo sería la edición de vistas para perfiles de usuario, que sólo son editables por el usuario actual, como

return $model->id === Yii::app()->user->id; 
+0

¿Puede explicar esto mejor? ¿Por qué los bizRules deben estar en la base de datos? ¿Por qué no los configura en su código? –

+0

Como se mencionó anteriormente ... puede mover su lógica al código PHP, los escenarios anteriores describen un caso de uso con Roles asignados en masa (o Tareas u Operaciones). Si selecciona Acceder() a un elemento como 'CanEditOwnPost', deberá verificar si la publicación * actual * pertenece al usuario, esto no se puede hacer con una entrada 'estática'. Haga el control en el código PHP y asigne el elemento, luego ... o agregue un bizRule a su base de datos, que hace esta comprobación por usted. – schmunk

+0

Todavía no tiene sentido ya que el código en la base de datos se evalúa. Sería mejor si esto estuviera en un controlador o algo así. –

1

¿Por qué poner cualquier cosa en una base de datos vs código?

Una buena razón es para que los desarrolladores no puedan editarlo.

En nuestra aplicación, permitimos a los usuarios administrar sus permisos en sus propios usuarios y elementos.

No tiene que usar las reglas comerciales de yii rbac. Podrías permitir decir algunos roles y tareas diferentes, y tener el resto de la lógica de autenticación en el código.

+1

La idea de que el código de edición de los desarrolladores no tiene mucho sentido como argumento. – hakre

Cuestiones relacionadas