2010-11-21 34 views
0

J'ai simplement une fonction CRUD générée par symfony. Il existe un propriétaire de classe et d'article. Je veux empêcher d'autres utilisateurs que le propriétaire de l'article actuel de le modifier. Je pensais à personnaliser mon propre filtre ou validateur, mais quand j'implémenterais un validateur, certains des utilisateurs peuvent entrer dans le formulaire d'édition (ils ne pouvaient pas seulement l'envoyer). Mais quand j'implémenterai le filtre d'utilisateur il y aura un problème pour que le filtre s'exécute seulement avant certaines actions (éditer dans ce cas).Restriction d'accès Symfony aux actions CRUD

Comment devrais-je faire cela?

Répondre

0

Je pense que c'est intégré. Vous devriez lire sur le fichier security.yml.

MISE À JOUR: Je vois ... apparemment le système de sécurité calls the method hasCredential() of the user object. Peut-être pourriez-vous étendre cette méthode dans votre classe d'utilisateurs personnalisée, afin qu'elle effectue une vérification spéciale lorsque son paramètre est, par exemple, 'article_owner'.

Une fois cela fait, tout ce que vous aurez à faire est de spécifier ces informations d'identification pour les actions que vous voulez

+0

Je sais ce que c'est. Mais je devrais faire par exemple. "all: informations d'identification: owner_article_5" pour tous les articles ... Ant je ne sais pas comment spécifier les informations d'identification à chaque propriétaire. – user364622

+0

@ user364622: Voir ma mise à jour ci-dessus – greg0ire

+0

Nice:] J'ai déjà écrit une méthode "isOwner" dans ma classe d'action. Mais la solution que vous suggérez est belle et intelligente. Je pense que la surcharge de classe d'utilisateurs est une bonne chose pour ce problème. – user364622

0

Je ne pense pas que symfony supporte le contrôle d'accès au niveau de l'objet hors de la boîte. J'ai eu ce problème particulier dans une de mes applications et j'ai fini par vérifier explicitement si l'utilisateur connecté correspond au propriétaire dans l'action d'édition. C'est la fonction que j'ai utilisée pour cela:

protected function hasObjectAccess($obj) { 
    if ($this->getUser()->hasGroup('admin') 
     || $obj->getOwnerId() == $this->getUser()->getId()))) { 
     return true; 
    } 
    return false; 
}