symfony 4 admin
Sonata Admin Bundle panel de control de entidad de rol y permisos DDBB (3)
La forma más fácil es editar la consulta y verificar el acceso en las acciones de edición / demostración.
Algo como esto:
Clase de administración
/**
* {@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;
}
Si el usuario no es MASTER, solo verá sus propias entidades.
También puede implementar el método hasSubjectAccess
de la clase de administración como:
/**
* 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;
}
y realice este tipo de control en las formas de edición y demostración:
/**
* {@inheritdoc}
*/
protected function configureFormFields(FormMapper $formMapper)
{
if (!$this->hasSubjectAccess()) {
throw new AccessDeniedException();
}
// ...
}
La otra forma es implementar ACL. Puede leer más sobre eso en la documentación oficial
Estoy usando SonataAdminBundle con FosUserBundle. Tengo un poco de problemas en mi tablero.
En mi aplicación, tengo recursos, empresas y usuarios. Un usuario pertenece a una empresa y puede crear recursos que también pertenecerán a su empresa. Todos estos procesos se llevarán a cabo en el panel, que es accesible para todos los roles.
Lo que estoy tratando de hacer es que todos puedan acceder al tablero, pero cuando un usuario selecciona una entidad (recurso) para listar en el tablero, solo se mostrarán las entidades de sus empresas. Por ejemplo, dos compañías podrían crear un vehículo (recurso), pero cada compañía solo verá sus propios vehículos (recursos).
Para finalizar, quiero que el Dashboard filtre las entidades de la compañía del usuario que está conectado. ¿Hay alguna manera de crear en el Sonata una consulta para mostrar solo algunas entidades dependiendo del ID de la empresa del usuario y el ID de la compañía del recurso mapeado en el BBDD?
Finalmente, lo entiendo así:
public function createQuery($context = ''list'')
$query = $this->getModelManager()->createQuery($this->getClass(), ''entity'');
if ( ($this->getClass() instanceof /Sademer/CoreBundle/Entity/Resource)
|| ( is_subclass_of($this->getClass(), /Sademer/CoreBundle/Entity/Resource'') ) )
{
$query->select (''e'');
$query->from($this->getClass(), ''e'');
$query->from(''CoreBundle/Entity/Resource'', ''r'');
$query->where(''e.id = r.id AND r.company = :company'');
$query->setParameter(''company'', 5);
}
}
Para mí, la función createQuery () no funcionó. Puede deberse a la versión de Sonata Admin. De todos modos, lo que funcionó para mí fue la función configureDatagridFilters ().
Hace el mismo trabajo que createQuery y se ve así:
protected function configureDatagridFilters(DatagridMapper $datagridMapper)
{
$qb = $datagridMapper
->getDatagrid()
->getQuery()
->getQueryBuilder();
$qb->andWhere(
// Your where clause here
);
$qb->setParameter(); // Set Parameter
}