最简单的方法是编辑查询并检查编辑/显示操作中的访问权限。
像这样的东西:
管理类
/**
* {@inheritdoc}
*/
public function createQuery($context = 'list')
{
$user = $this->getConfigurationPool()->getContainer()->get('security.context')->getToken()->getUser();
/** @var \Sonata\DoctrineORMAdminBundle\Datagrid\ProxyQuery @query */
$query = $this->getModelManager()->createQuery($this->getClass(), 'o');
if (!$this->isGranted('MASTER')) {
$query
->where('entity.user = :user')
->setParameter('user', $user)
;
}
return $query;
}
如果用户不是 MASTER,他只会看到他自己的实体。
您还可以实现hasSubjectAccess
管理类的方法,例如:
/**
* Check whether the user has access to the subject
*
* @return bool
*/
protected function hasSubjectAccess()
{
$user = $this->getConfigurationPool()->getContainer()->get('security.context')->getToken()->getUser();
if (!$this->isGranted('MASTER') && $this->getSubject()->getUser() !== $user) {
return false;
}
return true;
}
并在编辑和显示表单中执行这种检查:
/**
* {@inheritdoc}
*/
protected function configureFormFields(FormMapper $formMapper)
{
if (!$this->hasSubjectAccess()) {
throw new AccessDeniedException();
}
// ...
}
另一种方式是实现ACL。您可以在官方文档中阅读更多相关信息