Asignación de acceso a CakePHP en el acceso a datos específicos basados ​​en roles

StackOverflow https://stackoverflow.com/questions/6370384

  •  28-10-2019
  •  | 
  •  

Pregunta

El requisito de mi proyecto es algo como esto:

Encima estará el Administrador, que tendrá todos los accesos, primer nivel.

Bajo Administrador, habrá Jefes de Departamento, quienes tendrán todo el acceso, además de Crear Jefes de Departamento.

Bajo el Jefe de Departamento, habrá Otros Miembros, quienes administrarán los datos de su departamento asignado.

Ahora, todos los jefes de departamento tendrán su propia información y miembros, y todos los jefes de departamento/miembros tendrán acceso a sus propios registros específicos, que están ingresando/administrando.

Ahora, con el componente ACL de CakePHP, puedo dividir los roles y su nivel de acceso, pero todos los jefes de departamento pueden ver la información del otro jefe de departamento, ya que tendrán el mismo nivel de acceso, y todos los demás miembros pueden ver la información de los demás miembros en diferencias. departamentos, a partir de ellos tendrán el mismo nivel de acceso.

La complejidad de mi proyecto es que: solo deben ser visibles la información/datos asignados o creados, aunque tienen asignaciones del mismo nivel/rol que los demás.

¿Alguien puede sugerirme la mejor opción para administrar todas estas cosas con complementos ya disponibles con CakePHP?

Puedo trabajar personalizando el componente ACL predeterminado, pero eso llevará más tiempo del esperado.

¡Se agradecería cualquier idea/sugerencia mejor!

¿Fue útil?

Solución

A mi modo de ver, ACL no es tan mágico.Por ejemplo:ACL podría administrar los permisos para saber quién tiene acceso para agregar/editar/eliminar un producto.pero no podrá cambiar una consulta para filtrar los productos de acuerdo con los permisos definidos (como "los usuarios del departamento A solo pueden ver los productos del departamento A").Bueno, en realidad eso es mentira, ACL podría gestionar eso, pero puede que no sea práctico, porque cada vez que agregas un producto tendrías que crear una ACO y establecer el permiso en la tabla AROS_ACOS y dado que AROS es una estructura de árbol, por lo que fácilmente podría convertirse en una pesadilla, si planeas consultar tus datos

Yo usaría un ACL solo de grupo para controlar el acceso a ciertas páginas/acciones y establecer reglas como:

  • "El jefe de departamento puede acceder a la página 'Lista de productos' y agregar/eliminar/modificar productos"
  • "Los administradores pueden acceder a todas las páginas"
  • "Otros usuarios pueden acceder a 'Lista de productos' y pueden agregar productos pero no eliminarlos"

y ajustaría mis consultas de acuerdo con el usuario conectado, por lo que en el controlador de la página 'lista de productos', haría algo como:

  • Si el usuario conectado pertenece al Jefe de Departamento, seleccione todos los productos donde product.department_id=connected_user.department_id
  • Si el usuario conectado es administrador, seleccione todos los productos

Si tiene demasiadas consultas y no quiere hacer miles de oraciones if, puede crear un componente, un comportamiento o tal vez extender el find() método en el app_model.La idea es capturar todas las consultas y verificar si uno de los modelos utilizados en la consulta tiene un campo llamado "department_id", si lo tiene, agregue el model.department_id=connected_user.department_id condición a la consulta.

Hice eso para un sitio web que se puede ver en varios idiomas y cada idioma tiene sus propios usuarios, datos, registros, etc., y hay un administrador que puede ver toda la información.y me está funcionando muy bien =)

¡Buena suerte!

EDITADO:el comportamiento que uso es:

<?php 
class LocalizableBehavior extends ModelBehavior { 

    /** 
     * Filter query conditions with the correct `type' field condition. 
     */ 
    function beforeFind(&$model, $query) 
    {
        /**
         * Condition for the paginators that uses joins
        */
        if(isset($query['joins']) && !empty($query['joins'])){
            foreach($query['joins'] as $key => $joinTable){
                if(ClassRegistry::init($joinTable['alias'])->hasField('lang')){
                    $query['joins'][$key]['conditions'][] = $joinTable['alias'].".lang = '".$_SESSION['lang']."'";
                }
            }
        }

        /**
         * condition for the normal find queries
        */
        if($model->hasField('lang') && $model->name != "User"){
                $query['conditions'][$model->name.'.lang'] = $_SESSION['lang'];
        }
        return $query;
    }

} 
?>

En realidad, es bastante simple, cambio la consulta para agregar una condición que coincida con el idioma actual ($_SESSION['lang']).En el controlador, todo lo que necesito hacer es adjuntar LocalizableBehavior y usar el método de búsqueda como de costumbre:

$this->Products->find('all');
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top