6
votes

Modification de la vue basée sur ACL dans CakePHP

Je veux être capable d'afficher ou de masquer certains éléments dans une vue basée sur la liste de contrôle d'accès. Par exemple, si un utilisateur consulte ma vue d'utilisateur / Index, je ne veux pas afficher un élément "Supprimer l'utilisateur" s'il n'a pas la permission de supprimer les utilisateurs. S'il est autorise à éditer les utilisateurs, je do veulent afficher un lien "Modifier l'utilisateur".

Je peux pirater cela ensemble, mais être très nouveau à gâteau, j'espère qu'il existe une solution élégante. Le meilleur que j'ai fait implique de garder la logique à deux endroits, alors c'est l'enfer de maintenir.

Merci!


0 commentaires

5 Réponses :


1
votes

Il n'y a pas de "solution élégante" générique :) J'ai toujours voulu faire aussi bien. Quoi qu'il en soit, comment vous pourriez le faire:

Ecraser l'aide HTML dans votre annuaire d'applications - Créez une copie à partir de /cake/libs/views/helpers/html.php à /app/views/helpers/html.php et a apporté des modifications dans la fonction HTML :: Link .

Par exemple, vous pouvez vérifier si l'URL contient une action Modifier ou supprimer.

L'autre partie consiste à transmettre les paramètres appropriés du contrôleur. Dans AppController :: AvantFeilter Vous pouvez lire les droits de l'utilisateur (il vaut mieux être mis en cache) et de le transmettre dans une variable d'autorisation spéciale à la vue.

Alors, lorsque vous avez les droits à votre avis, il est facile de modifier le lien. :)

Comme je l'ai dit que je ne l'ai pas fait dans un exemple réel, mais c'est comme ça que je le ferais.

Il y a 1 mauvais point dans cela - si l'aide HTML d'origine est modifiée, votre qui restera la même. Mais je crois que HTML Helper est assez mature pour moi, ce n'est pas un gros problème.


0 commentaires

1
votes

Je le fais comme ceci dans App_Controller.php, bien que vous puissiez aussi bien le faire dans des contrôleurs spécifiques. Les variables de vue $ usersindexalledexowed code> et $ configurationAlowed code> sont ensuite utilisés dans des instructions conditionnelles dans la vue.

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'));
}


0 commentaires

1
votes

Si vous ne voulez pas vous découcher avec des aides principaux remplaçants et que vous souhaitez une manière plus automatique de vérifier (sans noms d'utilisateur de codage rigide et utilisateurs ou paramétrer des variables spécifiques à un lien distinctes) Voici ma suggestion:

Stocker toutes les autorisations de l'utilisateur en tant que session vars lorsque l'utilisateur se connecte (effacer sur la déconnexion) et créer une aide d'autorisations pour vérifier si l'utilisateur est connecté aux autorisations pour une action spécifique.

code et exemple ici

espoir que cela aide


0 commentaires

0
votes

Il y a plusieurs approches de ce scénario. Comme NIK a déclaré, en utilisant une aide pour faire les chèques pour vous, c'est un moyen rapide de "externaliser" la logique et centralisez-la pour faciliter l'utilisation.

En réalité, consultez le ACLLINKHELPER - Cela fait exactement ce que vous recherchez, même si on restreint aux liens uniquement.


0 commentaires

4
votes

Je sais que c'est une vieille question maintenant, mais pour que quiconque cherche un moyen comme si j'étais ...

in appcontroller :: AvantFeilter Vous pouvez attribuer le composant ACL à une variable de vue, puis l'utiliser à votre vue: xxx

puis dans votre vue, il suffit de juser comme thie: xxx

Ce n'est pas nécessairement la solution la plus correcte Pour le faire, mais cela fonctionne bien


0 commentaires