Attribution de l'accès à CakePHP sur l'accès aux données spécifiques basées sur les rôles

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

  •  28-10-2019
  •  | 
  •  

Question

Mon exigence de projet est quelque chose comme ceci:

En haut, il y aura l'administrateur, qui aura tout accès en D, premier niveau

Sous l'administrateur, il y aura des chefs de département, qui auront tous les accès en D, en plus de créer des chefs de département

Sous le chef de département, il y aura d'autres membres, qui géreront leurs données allouées par le département.

Désormais, tous les différents chefs de département auront leurs propres informations et membres, et tous les chefs / membres du département auront accès à leurs propres dossiers spécifiques, qu'ils entrent / gèrent.

Maintenant, avec la composante ACL de CakePHP, je peux diviser les rôles et leur niveau d'accès, mais tous les chefs de département peuvent voir les informations de l'autre chef de département, car ils auront le même niveau d'accès, et tous les autres membres peuvent voir les informations sur les autres membres sur Diff Les départements, auront le même niveau d'accès.

Ma complexité du projet est que - ils ne doivent être visibles que leurs informations / données assignées ou créées, bien qu'elles aient les mêmes affectations de niveau / rôle que d'autres.

Quelqu'un peut-il me suggérer la meilleure option appropriée, pour gérer toutes ces choses avec des plug-ins déjà disponibles avec CakePHP.

Je peux travailler en personnalisant le composant ACL par défaut, mais cela prendra plus de temps que ce qui est attendu.

De meilleures idées / suggestions seraient appréciées!

Était-ce utile?

La solution

La façon dont je le vois, ACL n'est pas si magique. Pour Exemple: ACL pourrait gérer les autorisations pour indiquer qui a accès pour ajouter / modifier / supprimer un produit. Mais il ne pourra pas modifier une requête pour filtrer les produits en conséquence aux autorisations définies (comme "les utilisateurs du département A ne peuvent que Voir les produits du département A ") .. En fait, c'est un mensonge, ACL pourrait gérer cela, mais ce n'est peut-être pas pratique, car chaque fois que vous ajoutez un produit, vous devez créer un ACO et définir l'autorisation dans le tableau Aros_acos Et puisque l'AROS est une structure d'arbres, elle pourrait facilement devenir un nigthmare, si vous prévoyez de demander vos données

J'utiliserais un ACL uniquement en groupe Pour contrôler l'accès à certaines pages / actions et établir des règles comme:

  • "Le chef de département peut accéder à la page« Liste des produits »et ajouter / supprimer / modifier les produits»
  • "Les administrateurs peuvent accéder à toutes les pages"
  • "Les autres utilisateurs peuvent accéder à la« liste des produits »et ils peuvent ajouter des produits mais ne pas les supprimer»

Et j'ajusterais mes requêtes en conséquence à l'utilisateur connecté, donc dans la page du contrôleur de la «liste de produits», je ferais quelque chose comme:

  • Si l'utilisateur connecté s'éteint au chef de département, sélectionnez tous les produits où product.department_id=connected_user.department_id
  • Si l'utilisateur connecté est administrateur, sélectionnez tous les produits

Si vous avez trop de requêtes et que vous ne voulez pas faire des milliers de phrases de SI, vous pourriez créer un composant, un comportement ou peut-être étendre le find() Méthode dans le app_model. L'idée est d'attraper toutes les requêtes et de vérifier si l'un des modèles utilisés sur la requête a un champ appelé "Department_id", s'ils le font, ajoutez le model.department_id=connected_user.department_id condition à la requête.

Je l'ai fait pour un site Web qui peut être vu dans plusieurs langues et chaque langue a ses propres utilisateurs, données, journaux, etc., et il y a un administrateur qui peut voir toutes les informations .. et cela fonctionne très bien pour moi =)

Bonne chance!

ÉDITÉ:Le comportement que j'utilise est:

<?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;
    }

} 
?>

C'est vraiment simple, je change la requête pour ajouter une condition pour correspondre à la langue actuelle ($ _session ['lang']). Dans le contrôleur, tout ce que je dois faire est de fixer le LocalizableBehavior et d'utiliser la méthode de recherche comme d'habitude:

$this->Products->find('all');
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top