2010-07-19 10 views
6

Quiero poder mostrar u ocultar ciertos elementos en una vista basada en ACL. Por ejemplo, si un usuario está mirando mis usuarios/vista de índice, no quiero mostrar un elemento 'Eliminar usuario' si no tiene permiso para eliminar usuarios. Si él tiene tiene permiso para editar usuarios, I do quiere mostrar un enlace 'Editar usuario'.Modificar la vista basada en ACL en CakePHP

Puedo hackear esto juntos, pero siendo muy nuevo en Cake, espero que haya una solución elegante. Lo mejor que he hecho es mantener la lógica en dos lugares, así que es un infierno para mantener.

Gracias!

Respuesta

1

No existe una "solución elegante" genérica :) Siempre he querido hacer tal cosa. De todos modos la forma en que podría hacerlo:

Sobrescribir el asistente de HTML en el directorio de aplicación - hacer una copia de /cake/libs/views/helpers/html.php a /app/views/helpers/html.php y hecho algunos cambios en la función Html :: link.

Por ejemplo, puede verificar si la url contiene acción editar o eliminar.

La otra parte es pasar los parámetros correctos del controlador. En AppController :: beforeFilter, puede leer los derechos del usuario (es mejor estar en caché) y pasarlo en una variable Auth especial a la Vista.

Por lo tanto, cuando tiene los derechos sobre su Vista, es fácil modificar el enlace. :)

Como dije, no lo he hecho en el ejemplo real, pero esta es la manera en que lo haría.

Hay 1 punto malo en eso: si se cambia el helper Html original, el suyo seguirá siendo el mismo. Pero creo que Html helper es lo suficientemente maduro así que para mí no es un gran problema.

1

Lo hago así en app_controller.php, aunque también podría hacerlo en controladores específicos. Las variables de vista $usersIndexAllowed y $configureAllowed se usan luego en declaraciones condicionales en la vista.

function beforeRender() 
{ 
    if($this->layout=='admin') 
    { 
     $usersIndexAllowed = $this->Acl->check($user,"users/index"); 
     $configureAllowed = $this->Acl->check($user,"siteAdmins/configure"); 
    } 
    $this->set(compact('usersIndexAllowed','configureAllowed')); 
} 
1

En caso de que no quiere perder el tiempo con ayudantes básicos primordiales y desea una forma más automática de control (sin disco de codificación de nombres de usuarios y grupos de usuarios o establecer variables de enlace específico separadas) aquí está mi sugerencia:

Almacene todos los permisos de usuario como valores de sesión cuando el usuario inicie sesión (finalice el cierre de sesión) y cree un asistente de permisos para verificar si el usuario conectado tiene permisos para una acción específica.

código y ejemplo here

esperanza de que ayuda a

0

Hay varios enfoques para este escenario. Como dijo Nik, usar un ayudante para realizar los controles es una forma rápida de "subcontratar" la lógica y centralizarla para facilitar su uso.

En realidad, eche un vistazo a AclLinkHelper - hace exactamente lo que está buscando, sin embargo, se limita solo a los enlaces.

4

Sé que esta es una vieja pregunta ahora, pero para cualquiera que busque una manera como yo era ...

En AppController :: beforeFilter puede asignar el componente ACL a una variable de vista y luego usarlo en su opinión:

$this->set('user', $this->Auth->user());  
$this->set('acl', $this->Acl); 

Y luego, en que ver sólo Juse ella como Thie:

if($acl->check(array('User' => $user), 'controllers/groupd/admin_delete')) { 

Esta no es necesariamente la forma más correcta de hacerlo, pero funciona bien

Cuestiones relacionadas