2013-04-19 2 views
1

Je souhaite écrire un gestionnaire de sécurité personnalisé. Il s'agit d'une ACL simple qui limite les données par ID utilisateur. Je ne veux pas utiliser une ACL standart, pas besoin d'utiliser tout fonctionnel et créer une base de données supplémentaire avec des autorisations.Administrateur Sonata et Gestionnaire de sécurité personnalisé

Donc je crée mon nouveau gestionnaire et maintenant je reçois l'objet $ en tant que classe Admin. Avec la classe Admin, je peux restreindre l'accès aux services, mais je ne peux pas restreindre les lignes en service.

La question est de savoir comment je peux recevoir des entités et vérifier l'autorisation sur les entités comme celui-ci:

public function isGranted(AdminInterface $admin, $attributes, $object = null) 
    { 
    if ($object->getUserId()==5){ 
     return true 
    } 
    } 

Répondre

2

Ecraser le gestionnaire de la sécurité dans la configuration sonate:

sonata_admin: 
    title: "Admin" 
    security: 
     handler: custom.sonata.security.handler.role 

Créer votre service:

custom.sonata.security.handler.role: 
     class: MyApp\MyBundle\Security\Handler\CustomRoleSecurityHandler 
     arguments: 
      - @security.context 
      - [ROLE_SUPER_ADMIN, ROLE_ADMIN, ROLE_USER] 
      - %security.role_hierarchy.roles% 

La dernière étape, mais non moins importante, est de créer votre classe, récupérer votre utilisateur et en fonction de ses informations d'identification permettent/refusent l'accès:

/** 
* Class CustomRoleSecurityHandler 
*/ 
class CustomRoleSecurityHandler extends RoleSecurityHandler 
{ 
    protected $securityContext; 

    protected $superAdminRoles; 

    protected $roles; 

    /** 
    * @param \Symfony\Component\Security\Core\SecurityContextInterface $securityContext 
    * @param array $superAdminRoles 
    * @param $roles 
    */ 
    public function __construct(SecurityContextInterface $securityContext, array $superAdminRoles, $roles) 
    { 
     $this->securityContext = $securityContext; 
     $this->superAdminRoles = $superAdminRoles; 
     $this->roles = $roles; 
    } 

    /** 
    * {@inheritDoc} 
    */ 
    public function isGranted(AdminInterface $admin, $attributes, $object = null) 
    { 
     /** @var $user User */ 
     $user = $this->securityContext->getToken()->getUser(); 

     if ($user->hasRole('ROLE_ADMIN')){ 
      return true; 
     } 

     // do your stuff 
    } 
} 
Questions connexes