Symfony Sonata管理和自定义安全处理程序

Symfony Sonata管理和自定义安全处理程序,symfony,acl,sonata-admin,sonata-user-bundle,Symfony,Acl,Sonata Admin,Sonata User Bundle,我想写一个自定义的安全处理程序,这将是一个简单的ACL,它通过用户id限制数据。我不想使用标准的ACL,不需要使用所有功能和创建具有权限的传统数据库 所以我创建了我的新处理程序,现在我接收$object作为Admin类。使用Admin类,我可以限制对服务的访问,但不能限制服务中的任何行 问题是如何接收实体并检查对以下实体的权限: public function isGranted(AdminInterface $admin, $attributes, $object = null) {

我想写一个自定义的安全处理程序,这将是一个简单的ACL,它通过用户id限制数据。我不想使用标准的ACL,不需要使用所有功能和创建具有权限的传统数据库

所以我创建了我的新处理程序,现在我接收$object作为Admin类。使用Admin类,我可以限制对服务的访问,但不能限制服务中的任何行

问题是如何接收实体并检查对以下实体的权限:

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

覆盖sonata配置中的安全处理程序:

sonata_admin:
    title: "Admin"
    security:
         handler: custom.sonata.security.handler.role  
创建您的服务:

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%
最后一步,但同样重要的是创建类,检索用户并根据其凭据允许/拒绝访问:

/**
* 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
    }
}