Symfony+EasyAdminBundle+FOSUserBundle管理员仅查看普通用户可行性咨询
当然可以实现!EasyAdminBundle完全支持这种角色过滤的需求,之前用Sonata能做到的,在EasyAdmin里同样没问题,甚至实现起来还挺灵活的。下面给你几种常用的实现方式,你可以根据自己的业务场景来选:
方法一:通过配置文件快速过滤
最简单的方式是直接在EasyAdmin的配置文件里,给User实体的列表视图添加过滤规则。因为FOSUserBundle默认的roles字段是数组类型,所以可以用Doctrine的MEMBER OF语法来判断角色是否存在:
在config/packages/easy_admin.yaml中修改User实体的配置:
easy_admin: entities: User: class: App\Entity\User list: # 过滤掉拥有ROLE_ADMIN角色的用户 dql_filter: "'ROLE_ADMIN' NOT MEMBER OF entity.roles"
如果你的roles字段是字符串类型(比如用逗号分隔),可以改成字符串匹配的写法:
dql_filter: "entity.roles NOT LIKE '%ROLE_ADMIN%'"
方法二:自定义CrudController实现灵活逻辑
如果需要更复杂的逻辑(比如根据当前登录用户的角色动态调整过滤规则),推荐自定义CrudController,重写查询构建方法:
创建或修改App\Controller\Admin\UserCrudController:
namespace App\Controller\Admin; use App\Entity\User; use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController; use EasyCorp\Bundle\EasyAdminBundle\Dto\SearchDto; use EasyCorp\Bundle\EasyAdminBundle\Dto\EntityDto; use EasyCorp\Bundle\EasyAdminBundle\Collection\FieldCollection; use EasyCorp\Bundle\EasyAdminBundle\Collection\FilterCollection; use Doctrine\ORM\QueryBuilder; use Symfony\Component\Security\Core\Security; class UserCrudController extends AbstractCrudController { private $security; // 注入Security服务,用于获取当前登录用户 public function __construct(Security $security) { $this->security = $security; } public static function getEntityFqcn(): string { return User::class; } public function createIndexQueryBuilder(SearchDto $searchDto, EntityDto $entityDto, FieldCollection $fields, FilterCollection $filters): QueryBuilder { $qb = parent::createIndexQueryBuilder($searchDto, $entityDto, $fields, $filters); $currentUser = $this->security->getUser(); // 只有非超级管理员才需要过滤管理员用户 if (!$currentUser->hasRole('ROLE_SUPER_ADMIN')) { $qb->andWhere(':adminRole NOT MEMBER OF entity.roles') ->setParameter('adminRole', 'ROLE_ADMIN'); } return $qb; } }
这种方式的好处是可以根据当前用户的权限动态调整显示内容,比如超级管理员能看到所有用户,普通管理员只能看到普通用户。
进阶:完全分离管理员与普通用户的菜单入口
如果你想在后台菜单里分别显示“普通用户”和“管理员用户”两个独立入口,可以在配置文件里注册两个指向同一实体的配置,分别设置不同的过滤规则:
easy_admin: entities: RegularUser: class: App\Entity\User label: '普通用户' list: dql_filter: "'ROLE_ADMIN' NOT MEMBER OF entity.roles" AdminUser: class: App\Entity\User label: '管理员用户' list: dql_filter: "'ROLE_ADMIN' MEMBER OF entity.roles"
这样后台左侧菜单就会出现两个选项,分别对应不同的用户群体,完全分离展示。
这些方法都能满足你的需求,选最适合自己业务场景的就行~
内容的提问来源于stack exchange,提问作者Lilith
相关产品推荐
相关产品推荐

