安全
EasyAdmin 依赖 Symfony Security 来处理所有与安全相关的事宜。因此,在限制对后端某些部分的访问之前,您需要在您的 Symfony 应用程序中正确设置安全性
- 在您的应用程序中创建用户并分配适当的权限 (例如
ROLE_ADMIN
); - 定义一个防火墙,覆盖后端的 URL。
限制对整个后端的访问
使用access_control 选项,您可以告知 Symfony 需要特定权限才能浏览与后端关联的 URL。 这很容易做到,因为每个仪表板只使用一个 URL
1 2 3 4 5 6 7 8
# config/packages/security.yaml
security:
# ...
access_control:
# change '/admin' by the URL used by your Dashboard
- { path: ^/admin, roles: ROLE_ADMIN }
# ...
另一种选择是将安全注解添加到仪表板控制器
1 2 3 4 5 6 7 8 9 10 11 12
// app/Controller/Admin/DashboardController.php
use EasyCorp\Bundle\EasyAdminBundle\Config\Dashboard;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractDashboardController;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
/**
* @IsGranted("ROLE_ADMIN")
*/
class DashboardController extends AbstractDashboardController
{
// ...
}
限制对菜单项的访问
使用 setPermission()
方法来定义用户必须拥有的安全权限才能看到菜单项
1 2 3 4 5 6 7 8 9
public function configureMenuItems(): iterable
{
return [
// ...
MenuItem::linkToCrud('Blog Posts', null, BlogPost::class)
->setPermission('ROLE_EDITOR'),
];
}
注意
此权限仅显示/隐藏菜单项。 与这些菜单项关联的操作仍然可执行,即使用户看不到菜单项。 使用操作权限也可以限制对这些操作的访问。
如果您的需求更高级,请记住仪表板类是一个常规的 Symfony 控制器,因此您可以使用任何与安全相关的服务来评估复杂表达式。 在这些情况下,使用替代菜单项定义更方便,无需处理数组合并
1 2 3 4 5 6 7 8 9 10
public function configureMenuItems(): iterable
{
yield MenuItem::linkToDashboard('Dashboard', 'fa fa-home');
if ($this->isGranted('ROLE_EDITOR') && '...') {
yield MenuItem::linkToCrud('Blog Posts', null, BlogPost::class);
}
// ...
}
限制对操作的访问
使用 setPermission()
方法来定义查看操作链接/按钮所需的安全权限
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
use EasyCorp\Bundle\EasyAdminBundle\Config\Action;
use EasyCorp\Bundle\EasyAdminBundle\Config\Actions;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
public function configureActions(Actions $actions): Actions
{
$viewInvoice = Action::new('invoice', 'View invoice', 'fa fa-file-invoice')
->linkToCrudAction('renderInvoice');
return $actions
// ...
->add(Crud::PAGE_DETAIL, $viewInvoice)
// use the 'setPermission()' method to set the permission of actions
// (the same permission is granted to the action on all pages)
->setPermission('invoice', 'ROLE_FINANCE')
// you can set permissions for built-in actions in the same way
->setPermission(Action::NEW, 'ROLE_ADMIN')
;
}
限制对字段的访问
有几种选项可以根据登录用户限制页面中显示的信息。 首先,您可以使用 setPermission()
方法显示/隐藏整个字段
1 2 3 4 5 6 7 8 9 10 11 12
public function getFields(string $action): iterable
{
return [
IdField::new('id'),
TextField::new('price'),
IntegerField::new('stock'),
// users must have this permission/role to see this field
IntegerField::new('sales')->setPermission('ROLE_ADMIN'),
FloatField::new('commission')->setPermission('ROLE_FINANCE'),
// ...
];
}
您还可以借助 setEntityPermission()
方法限制用户可以在 index
和 detail
页面中看到哪些项目。 此值作为调用 is_granted($permissions, $item)
函数的第一个参数传递,以决定当前用户是否可以看到给定的项目
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
namespace App\Controller\Admin;
use EasyCorp\Bundle\EasyAdminBundle\Config\Crud;
use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController;
class ProductCrudController extends AbstractCrudController
{
// ...
public function configureCrud(Crud $crud): Crud
{
return $crud
->setEntityPermission('ROLE_ADMIN')
// ...
;
}
}
在 detail
页面中,如果用户没有权限,他们将看到相应的错误消息(并且您将在应用程序日志中看到详细的错误消息)。
在 index
页面中,为了避免混淆和分页错误,如果用户没有权限查看某些项目,则将在列表底部显示一个空行,并显示一条消息解释他们没有足够的权限来查看某些项目

自定义安全投票器
EasyAdmin 实现了 Symfony 安全投票器来检查为操作、实体、菜单项等定义的权限。 实际的安全权限在 EasyCorp
类中定义为常量(例如 Permission::EA_EXECUTE_ACTION
, Permission::EA_VIEW_MENU_ITEM
, 等等)
如果您为后端定义了自定义安全投票器,请考虑更改应用程序使用的访问决策策略。 默认策略称为 affirmative
,只要有一个投票器授予访问权限就授予访问权限(如果 EasyAdmin 投票器授予访问权限,您的自定义投票器将无法拒绝它)。
这就是为什么您应该将默认策略更改为 unanimous
,只有在没有投票器拒绝访问时才授予访问权限
1 2 3 4
# config/packages/security.yaml
security:
access_decision_manager:
strategy: unanimous