首页 > 解决方案 > 如何使用 FOSbundle 在奏鸣曲中正确管理角色并授予用户只读权限?

问题描述

我正在做一个奏鸣曲项目,我使用 Doctrine 管理我的数据库,并使用 FOSbundle 管理我的用户登录。我试图赋予我的用户不同的权利。我有一个名为 Suivi 的实体,这是我当前 Suivi 列表菜单的屏幕截图。正如您在右侧看到的,有不同的按钮(显示、编辑、删除):

截屏

我想向某些用户隐藏编辑和删除按钮,就像这样只给他们阅读权限。

因此,受此链接的启发,我在 security.yml 中创建了 ROLE_SONATA_SUIVI_READER:

Sonata 管理员中的角色

/app/config/security.yml

security:
encoders:
    FOS\UserBundle\Model\UserInterface: bcrypt

role_hierarchy:
    ROLE_SONATA_SUIVI_READER:
        - ROLE_SONATA_ADMIN_DEMO_SUIVI_LIST
        - ROLE_SONATA_ADMIN_DEMO_SUIVI_VIEW
    ROLE_ADMIN:       ROLE_USER
    ROLE_SUPER_ADMIN: ROLE_ADMIN
    ROLE_DEFAULT:     ROLE_SONATA_SUIVI_READER

providers:
    fos_userbundle:
        id: fos_user.user_provider.username_email

firewalls:

    console:
        pattern: ^/_console
        anonymous: false
        security: true
        logout:       true
        http_basic: ~
    main:
        pattern: ^/
        form_login:
            provider: fos_userbundle
            csrf_token_generator: security.csrf.token_manager
            default_target_path: /admin/dashboard
        logout:
          path:       fos_user_security_logout
          target:     fos_user_security_login
        anonymous:    true


access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin/, role: ROLE_DEFAULT }

/src/AppBundle/Admin/SuiviAdmin.yml

  protected function configureListFields(ListMapper $listMapper)
{
    $listMapper
      ->add('phylica', null, array('associated_property' => 'numeroPlant'))
      ->add('phenologie','text',array('label'=>'Phénologie'))
      ->add('traitement','text',array('label'=>'Traitement'))
      ->add('competition','text',array('label'=>'Compétition'))
      ->add('predation','text',array('label'=>'Prédation'))
      ->add('periode','text',array('label'=>'Période'))
      ->add('saison')
      ->add('hauteurMaximumCm','text',array('label'=>'Hauteur Max(cm)'))
      ->add('dbhB','text',array('label'=>'dbh b'))
      ->add('dbhH','text',array('label'=>'dbh h'))
      ->add('mort','text',array('label'=>'Mort'))
      ->add('nonTrouve','text',array('label'=>'Non trouvé'))
      ->add('_action', null, array(
        'actions' => array(
          'show' => array(),
          'edit' => array(),
          'delete' => array(),
        )
      ));
}

这是我在配置中的 fos_user 设置:

/app/config/config.yml

fos_user:
db_driver: orm
firewall_name: main
user_class: AppBundle\Entity\User

registration:
    form:
        type: AppBundle\Form\RegistrationFormType
group:
    group_class: AppBundle\Entity\Group

service:
    mailer: fos_user.mailer.default
from_email:
    address: "%mailer_user%"
    sender_name: "%mailer_user%"
resetting:
     email:
        from_email:
            address:        toto@gmail.com
            sender_name:    Demo Resetting

根据 symfony 的文档(https://symfony.com/doc/3.4/security.html),我认为我可以在 twig 文件中执行以下操作:

{% if is_granted('ROLE_ADMIN') %}
    <p>DISPLAY SOMETHING</p>
{% endif %}

但是这个解决方案不能让我满意,这不是 FOSbundle 做事的方式,我不想过度使用 Sonata twig 文件。如果有人有解决方案...在此先感谢。

标签: symfonyfosuserbundlesonata-admin

解决方案


推荐阅读