我正在尝试使用Voters实现一些场景,但我不确定这是否是一个好方法,所以让我解释一下。
我的申请分为frontoffice
和backoffice
。前台主要是客户区,后台为管理团队。
所以我想在access_control
(类似的东西)中扮演两个主要角色:
access_control:
- { path: ^/.+/backoffice, roles: [ROLE_BACKOFFICE] }
- { path: ^/.+/frontoffice, roles: [IS_AUTHENTICATED_ANONYMOUSLY, ROLE_FRONTOFFICE] }
根据这些角色,我们可以确定谁应该能够访问给定的链接。
现在,如果您访问backoffice
,我必须能够确定用户应该看到哪个部分以及他对该部分的权限。
示例1:
ROLE
:ROLE_MANAGER
SECTION
:SECTION_CLIENTS, SECTION_REPORTS, SECTION_PROGRAMS, SECTION_SCHEDULE
PERMISSION
:CAN_VIEW, CAN_CREATE, CAN_EDIT, CAN_DELETE
示例2:
ROLE
:ROLE_INTERN
SECTION
:SECTION_REPORTS
PERMISSION
:CAN_VIEW
所有角色都应该通过界面管理,并且可以存储在数据库中。
我尝试使用Voters,但我试图像这样使用它:
$this->denyAccessUnlessGranted('view', 'SECTION_REPORTS' 'Unauthorized access!');
但是这是抱怨第二个参数必须是一个对象,所以报告只是一个视图,所以我不能传递字符串,我可以为此创建一个简单的对象,并将其传递给它:
$this->denyAccessUnlessGranted('view', new SectionReport(), 'Unauthorized access!');
并在ReportsVoter类中执行所有必要的逻辑,但之后我将如何使用
在Twig中显示或隐藏菜单 {% if is_granted('view', 'SECTION_REPORTS') %}
<p>ACCESS GRNANTED</p>
{% endif %}
我应该用自己的is_granted方法创建一个自定义的TwigExtension吗? 或者这个想法是完全错误的,我应该以不同的方式做到这一点?
我知道FOSUserBundle存在,但我不打算使用它,因为它包含太多配置,不需要。
还有一件事,配置面板看起来与此类似: