Symfony 3 - 我在管理角色方面遇到了一些困难

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Symfony 3 - 我在管理角色方面遇到了一些困难相关的知识,希望对你有一定的参考价值。

我正在尝试在我的网站上建立角色。我有3个管理页面:

  • /管理/用户
  • /管理/包
  • /管理/信息

ROLE_ADMIN必须能够访问这3个链接。

ROLE_INFOS必须能够访问/ admin / information

ROLE_PACKAGES必须能够访问/ admin / packages

我的security.php看起来像:

# app/config/security.yml
security:
    encoders:
        FOSUserBundleModelUserInterface: bcrypt

role_hierarchy:
    ROLE_ADMIN:       ROLE_USER, ROLE_INFOS, ROLE_PACKAGES
    ROLE_INFOS:       ROLE_INFOS, ROLE_USER
    ROLE_PACKAGES:    ROLE_PACKAGES, ROLE_USER
    ROLE_USER:        ROLE_USER

//...

access_control:
    - { path: ^/admin/paquets, role: ROLE_PACKAGES }
    - { path: ^/admin/informations, role: ROLE_INFOS }
    - { path: ^/admin, role: ROLE_ADMIN }
    - { path: ^/accueil, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/, role: ROLE_USER }

我想知道我的组织方式是否正确?

此外,在我的网站上,我有一个导航栏,根据用户的角色显示不同的选项卡

我有一个标签“管理”,它实际上是一个下拉菜单,指向3个可能的链接(包,用户,信息)。

只有,我在base.html.twig中有这个:

 {% if is_granted('ROLE_ADMIN') %}

此条件显示管理员的管理选项卡。我希望为我提到的每个角色(ROLE_ADMIN,ROLE_INFO,ROLE_PACKAGES)显示它。

我必须做类似的事情:

{% if is_granted('ROLE_ADMIN') %} or
{% if is_granted('ROLE_INFOS') %} or
{% if is_granted('ROLE_PACKAGES') %}

谢谢你的帮助

答案

您可以按照已经完成的方式进行管理,但......

  1. security.yml文件中存在一些错误(层次结构应返回数组并避免递归数组)
  2. 最安全的方法是通过控制器和视图来管理安全性,而不是security.yml中的access_control
#app/config/security.yml
security:
    encoders:
        FOSUserBundleModelUserInterface: bcrypt

role_hierarchy:
    ROLE_ADMIN:       [ROLE_USER, ROLE_INFOS, ROLE_PACKAGES]
    ROLE_INFOS:       [ROLE_USER]
    ROLE_PACKAGES:    [ROLE_USER]

在您的视图中,您可以使用以下方法隐藏某些链接

{% if is_granted('ROLE_ADMIN') %}
    <a href="{{ path('packages_foo') }}">Link to admin packages</a>
{% endif %}

请注意,只有Controller中的安全注释才能管理安全访问。如果您只使用上面的代码,则用户可以访问页面,如果它知道访问管理页面的URL。

在您的控制器中,您可以使用安全注释设置安全性,这比control_access文件中的security.yaml工具更好:

#src/Controller/PackageController.php

/* ... */
use SensioBundleFrameworkExtraBundleConfigurationSecurity;
use SymfonyBundleFrameworkBundleControllerAbstractController;
/* ... */

/**
 * Package controller .
 *
 * @Route("/admin/packages")
 *
 * @Security("is_granted('ROLE_PACKAGE')")
 */
class PaymentController extends AbstractController

看看Symfony security annotation文档。

以上是关于Symfony 3 - 我在管理角色方面遇到了一些困难的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 3 + JWT + angular 2 + 身份验证(选项方法)

使用 FosUserBundle symfony2 管理多个角色

Symfony ApiPlatform:在实体中作为序列化器/组的角色是个好主意吗?

奏鸣曲 | Symfony 3 |根据用户角色配置路由

以奏鸣曲管理员的编辑形式为用户设置角色

Symfony 3.1 - 缓存和图像