跳到内容

安全

编辑此页

EasyAdmin 依赖 Symfony Security 来处理所有与安全相关的事宜。因此,在限制对后端某些部分的访问之前,您需要在您的 Symfony 应用程序中正确设置安全性

  1. 在您的应用程序中创建用户并分配适当的权限 (例如 ROLE_ADMIN);
  2. 定义一个防火墙,覆盖后端的 URL。

已登录用户信息

当访问受保护的后端时,EasyAdmin 会显示已登录应用程序的用户的详细信息,以及包含诸如“注销”等选项的菜单。阅读用户菜单参考以获取更多详细信息。

限制对整个后端的访问

使用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() 方法限制用户可以在 indexdetail 页面中看到哪些项目。 此值作为调用 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 页面中,为了避免混淆和分页错误,如果用户没有权限查看某些项目,则将在列表底部显示一个空行,并显示一条消息解释他们没有足够的权限来查看某些项目

Index page with some results hidden because user does not have enough permissions

自定义安全投票器

EasyAdmin 实现了 Symfony 安全投票器来检查为操作、实体、菜单项等定义的权限。 实际的安全权限在 EasyCorp\Bundle\EasyAdminBundle\Security\Permission 类中定义为常量(例如 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
这项工作,包括代码示例,均根据 Creative Commons BY-SA 3.0 许可获得许可。
目录
    版本