我想编写一个自定义安全处理程序,这将是一个简单的ACL,它通过用户ID限制数据。我不想使用标准ACL,不需要使用所有功能并创建具有权限的aditional数据库。
所以我创建了我的新处理程序,现在我收到$ object作为Admin类。使用Admin类,我可以限制对服务的访问,但不能限制服务中的任何行。
问题是我如何收到实体并检查实体的许可,如下:
public function isGranted(AdminInterface $admin, $attributes, $object = null)
{
if ($object->getUserId()==5){
return true
}
}
答案 0 :(得分:2)
在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
}
}