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

时间:2012-02-22 10:07:38

标签: php symfony

我已安装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的用户点击管理广告时,它的工作非常完美 链接,他将在Access denied页面,但我想在菜单中隐藏此链接 在顶部导航和仪表板页面中,我是如何做到这一点的? 感谢

2 个答案:

答案 0 :(得分:2)

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。

答案 1 :(得分:0)

在模板中

执行以下操作:

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

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