如何正确管理角色并使用FOSbundle为Sonata中的用户提供读取权限?

时间:2018-06-15 13:29:00

标签: symfony fosuserbundle sonata-admin

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

screenshot

我想隐藏编辑和删除按钮给某个用户,这样只需给他们读取权限。

所以我在我的security.yml中创建了一个ROLE_SONATA_SUIVI_READER,灵感来自这个链接:

Roles in Sonata Admin

/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(),
        )
      ));
}

这是我在config中的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文件。 如果有人有解决方案......提前致谢。

0 个答案:

没有答案