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

时间:2019-04-23 11:27:01

标签: php symfony controls roles

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

  • / admin /用户
  • / admin / packages
  • / admin /信息

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

ROLE_INFOS 必须能够访问 / admin /信息

ROLE_PACKAGES 必须能够访问 / admin / packages

我的security.php看起来像:

# app/config/security.yml
security:
    encoders:
        FOS\UserBundle\Model\UserInterface: 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 个答案:

答案 0 :(得分:2)

您可以像以前一样对其进行管理,但是...

  1. 您的security.yml文件中存在一些错误(层次结构应返回数组,避免递归数组)
  2. 通过控制器和视图而不是security.yml中的access_control来管理安全性最简单
#app/config/security.yml
security:
    encoders:
        FOS\UserBundle\Model\UserInterface: 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 Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
/* ... */

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

请查看Symfony security annotation文档。