Symfony 3 - у меня есть некоторые трудности с управлением своими ролями - PullRequest
1 голос
/ 23 апреля 2019

Я пытаюсь установить роли на моем сайте. У меня есть 3 страницы администрирования:

  • / администратора / пользователей
  • / администратор / пакеты
  • / администратор / информация

ROLE_ADMIN должен иметь доступ к этим 3 ссылкам.

ROLE_INFOS должен иметь доступ к / admin / information

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 Ответ

2 голосов
/ 23 апреля 2019

Вы можете управлять этим, как вы уже сделали это, но ...

  1. В вашем файле security.yml есть некоторые ошибки (иерархия должна возвращать массив и избегать рекурсивного массива)
  2. Проще всего управлять безопасностью через контроллер и представления вместо access_control в вашем security.yml
#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 %}

Имейте в виду, что только аннотация безопасности в контроллере управляет безопасным доступом. Если вы используете только приведенный выше код, пользователь может получить доступ к странице, если ему известен 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 документацию.

...