首页 文章

如何将Dashboard页面中的链接隐藏到ROLE ADMIN并将其显示给ROLE_SUPER_ADMIN?

提问于
浏览
0

我已经安装了SonataAdminBundle并配置它管理我的实体,但我有2个管理员角色:ROLE_ADMIN和ROLE_SUPER_ADMIN我想限制对ROLE_ADMIN的一些管理服务的访问,我在security.yml文件中使用它:

access_control: 
        - { path: ^/admin/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } 
        - { path: ^/admin/ads, roles: ROLE_SUPER_ADMIN } 
        - { path: ^/admin, roles: ROLE_ADMIN } 
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }

它是完美的工作,当一个用户点击管理广告链接的ROLE_ADMIN时,他将进入访问被拒绝页面,但我想在顶部导航和仪表板页面的菜单中隐藏此链接,我是怎么做到的?谢谢

2 回答

  • 0

    SonataAdminBundle的默认安全处理程序是NOOP实现,它始终返回true . 您必须change the security configuration的管理包 .

    使用基于角色的安全性处理程序,您必须将角色添加到security.yml config as described here . 对于每个管理类,您必须在角色层次结构中添加到基础角色的角色数 . 如果您的管理类具有id my_bundle.admin.objectmy_bundle.admin.protected_object

    security:
      role_hierarchy:
        ROLE_SUPER_ADMIN: 
          - ROLE_USER
          - ROLE_ADMIN
          - ROLE_ALLOWED_TO_SWITCH
          - ROLE_MY_BUNDLE_ADMIN_PROTECTED_OBJECT_LIST
          - ROLE_MY_BUNDLE_ADMIN_PROTECTED_OBJECT_EDIT
          ....
        ROLE_ADMIN:
          - ROLE_USER
          - ROLE_SONATA_USER_ADMIN_USER_EDIT
          - ROLE_SONATA_USER_ADMIN_USER_LIST
          - ROLE_MY_BUNDLE_ADMIN_OBJECT_LIST
          - ROLE_MY_BUNDLE_ADMIN_OBJECT_EDIT
          ...
    

    您可能必须将所有管理/操作组合枚举为角色 . 如果你有大量的管理类,也许基于RoleSecurityHandler实现自定义安全处理程序是更好的选择 .

    注意我不太了解symfony中的ACL,也不了解AclSecurityHandler .

  • 2

    在您的模板中,执行以下操作:

    {% if is_granted('ROLE_ADMIN') %}
        <li><a href="{{ path('zayso_natgames_admin') }}">Admin</a></li>
    {% endif %}
    

    如果这些模板位于Sonata软件包中,那么您需要在app目录中覆盖它们 .

相关问题