role_hierarchy与Symfony2的(role_hierarchy with Symfo

2019-07-29 21:36发布

我有我的role_hierarchy一个很大的问题,

security:
    role_hierarchy:
        ROLE_ADMIN:[ROLE_USER,ROLE_AUTHOR,ROLE_MODERATOR]
        ROLE_SUPER_ADMIN:[ROLE_ADMIN,ROLE_ALLOWED_TO_SWITCH]

这一说法,如果我得到了超级管理员的角色,我就得到了ROLE_AUTHOR,ROLE_MODERATOR,ROLE_USER和ROLE_ADMIN。 但我的问题是,当我登录我的网站上,如果我检查剖析,我可以看到我只拿到了ROLE_SUPER_ADMIN,而不是其他人的角色,所以,你能帮助我吗?

我的观点( base.html.twig

<h3>Blog</h3>
<ul class="nav nav-pills nav-stacked">
    <li><a href="{{ path('dom_home') }}">Home Page</a></li>
    {% if is_granted('ROLE_AUTHOR') %}
        <li><a href="{{ path('dom_add') }}">Add a post</a></li>
    {% endif %}
    {% if is_granted('IS_AUTHENTICATED_FULLY') %}
        <li><a href="{{ path('fos_user_security_logout') }}">Logout</a></li>
    {% else %}
        <li><a href="{{ path('fos_user_security_login') }}">login</a></li>
        <li><a href="{{ path('fos_user_registration_register') }}">register</a></li>
    {% endif %}
</ul>

security.yml (应用程序/配置)

security:
    encoders:
        Symfony\Component\Security\Core\User\User: plaintext
        FOS\UserBundle\Model\UserInterface: sha512

    role_hierarchy:
        ROLE_ADMIN:       [ROLE_USER,ROLE_AUTHOR,ROLE_MODERATOR]
        ROLE_SUPER_ADMIN: [ROLE_ADMIN,ROLE_ALLOWED_TO_SWITCH]

    providers:
        in_memory:
            users:
                user:  { password: userpass, roles: [ 'ROLE_USER' ] }
                admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
        fos_userbundle:
            id: fos_user.user_manager
    firewalls:
        dev:
            pattern:  ^/(_(profiler|wdt)|css|images|js)/
            security: false
        login:
            pattern:   ^/(login$|register|resetting)
            anonymous: true
        main:
            pattern: ^/
            form_login:
                provider:    fos_userbundle
                remember_me: true
                always_use_default_target_path: true
                default_target_path: /dom/
            remember_me:
                key:         %secret%
            anonymous:       false
            logout:          true 

编辑:

我的观点(base.html.twig)

<h3>Blog</h3>
<ul class="nav nav-pills nav-stacked">
    <li><a href="{{ path('dom_home') }}">Home Page</a></li>
    {% if is_granted('ROLE_AUTHOR') %}
        <li><a href="{{ path('dom_add') }}">Add a post</a></li>
    {% endif %}
    {% if is_granted('IS_AUTHENTICATED_FULLY') %}
        <li><a href="{{ path('fos_user_security_logout') }}">Logout</a></li>
    {% else %}
        <li><a href="{{ path('fos_user_security_login') }}">login</a></li>
        <li><a href="{{ path('fos_user_registration_register') }}">register</a></li>
    {% endif %}
</ul>

我security.yml(应用程序/配置)

security:
    encoders:
        Symfony\Component\Security\Core\User\User: plaintext
        FOS\UserBundle\Model\UserInterface: sha512

    role_hierarchy:
        ROLE_ADMIN:       [ROLE_USER,ROLE_AUTHOR,ROLE_MODERATOR]
        ROLE_SUPER_ADMIN: [ROLE_ADMIN,ROLE_ALLOWED_TO_SWITCH]

    providers:
        in_memory:
            users:
                user:  { password: userpass, roles: [ 'ROLE_USER' ] }
                admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
        fos_userbundle:
            id: fos_user.user_manager
    firewalls:
        dev:
            pattern:  ^/(_(profiler|wdt)|css|images|js)/
            security: false
        login:
            pattern:   ^/(login$|register|resetting)
            anonymous: true
        main:
            pattern: ^/
            form_login:
                provider:    fos_userbundle
                remember_me: true
                always_use_default_target_path: true
                default_target_path: /dom/
            remember_me:
                key:         %secret%
            anonymous:       false
            logout:          true 

请回答 :)

Answer 1:

我看不出有什么根据您提供的代码段错误的,所以我做了一个小例子程序,给你一步步指令可能导致您的问题的根源。

  1. 克隆的symfony标准(主)(并除去的Acme \ DemoBundle)
  2. 加入"friendsofsymfony/user-bundle": "dev-master"到composer.json
  3. 创建新的软件包Mahok \ SecurityBundle( php app/console generate:bundle
  4. 创建新的实体php app/console doctrine:generate:entity
  5. 根据FOS \ UserBundle文档修改的实体(步骤3,重要提示:表名称更改为比“用户”以外的东西,因为这是一个保留字,可能会造成麻烦!)
  6. 改性app/AppKernel.phpapp/config/config.ymlapp/config/routing.ymlapp/config/security.yml根据FOS \ UserBundle文档。 供参考:这是我用的是security.yml:

     jms_security_extra: secure_all_services: false expressions: true security: encoders: FOS\UserBundle\Model\UserInterface: sha512 role_hierarchy: ROLE_AUTHOR: [ROLE_USER] ROLE_MODERATOR: [ROLE_AUTHOR] ROLE_ADMIN: [ROLE_MODERATOR] ROLE_SUPER_ADMIN: [ROLE_ADMIN] providers: fos_userbundle: id: fos_user.user_manager firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false auth: pattern: (^/login$|^/register|^/resetting) anonymous: true main: pattern: ^/ form_login: provider: fos_userbundle csrf_provider: form.csrf_provider logout: true anonymous: true access_control: - { path: ^/admin, role: ROLE_ADMIN } 
  7. 用`PHP应用程序/控制台FOS的用户:用户:建立安全联盟--super管理员

  8. 改性DefaultController:default.html.twig在Mahok \ SecurityBundle,检查{% is_granted('ROLE_MODERATOR') %}

     Hello {{ name }}! {% if is_granted('ROLE_MODERATOR') %} <ul> {% for role in app.user.roles %} <li>{{ role }}</li> {% endfor %} </ul> {% else %} oh noes! {% endif %} 

编辑:当去到localhost /例如/ app_dev.php /你好/用户(以“sa”登录后),我得到以下的输出:

Hello User!
* ROLE_SUPER_ADMIN
* ROLE_USER


文章来源: role_hierarchy with Symfony2