2012-06-13 27 views
6

साथ मैं अपने role_hierarchy के साथ एक बड़ी समस्या है,role_hierarchy Symfony2

security: 
    role_hierarchy: 
     ROLE_ADMIN:[ROLE_USER,ROLE_AUTHOR,ROLE_MODERATOR] 
     ROLE_SUPER_ADMIN:[ROLE_ADMIN,ROLE_ALLOWED_TO_SWITCH] 
उस के साथ

, अगर मैं SUPER_ADMIN भूमिका मिली, मैं 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 (एप्लिकेशन/config)

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 (एप्लिकेशन/config)

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 

उत्तर दें :)

+0

पदानुक्रम मतलब यह नहीं है, कि आप स्पष्ट रूप से इन भूमिकाओं में जुड़ जाते हैं, यानी कि जब आप प्रोफाइलर की जांच करें जिसमें आप सभी भूमिकाएं नहीं देखते हैं। इसका मतलब केवल यह है कि पहुंच "विरासत" है।दूसरे शब्दों में, जब आप ROLE_MODERATOR को किसी क्रिया तक पहुंच प्रतिबंधित करते हैं, भले ही आपको यह भूमिका नियुक्त नहीं की जाती है, फिर भी आप कार्रवाई को तब तक एक्सेस कर सकते हैं क्योंकि ROLE_SUPER_ADMIN पहुंच प्राप्त करता है। – dbrumann

+0

ठीक है, लेकिन अगर मैं कर रहा हूं is_granted ('ROLE_MODERATOR'), तो मैं इसका उपयोग कर पाऊंगा? पसंद है: {% अगर is_granted ('ROLE_MODERATOR')%} मॉडरेटर {% else%} कोई मॉडरेटर {% endif%}, एक ट्वेंग टेम्पलेट में, मैं मॉडरेटर देखने में सक्षम हूं? – Stickly

+0

मैंने अभी यह कोशिश कर रहा है और यह – Stickly

उत्तर

9

मैं नहीं देख सकता कि कोड के टुकड़े आपके द्वारा दी गई से गलत है, तो मैं आप से एक कदम देने के लिए एक छोटे से उदाहरण आवेदन किया चरण-निर्देश जो आपको समस्या के स्रोत तक ले जा सकता है।

  1. क्लोंड सिम्फोनी मानक (मास्टर) (और हटाया एक्मे \ DemoBundle)
  2. जोड़ा गया "friendsofsymfony/user-bundle": "dev-master"
  3. नया बंडल बनाया Mahok \ SecurityBundle composer.json को (php app/console generate:bundle)
  4. निर्मित नई इकाई php app/console doctrine:generate:entity
  5. एफओएस \ उपयोगकर्ता बंडल दस्तावेज के अनुसार संशोधित इकाई (चरण 3; महत्वपूर्ण: तालिका उपयोगकर्ता को "उपयोगकर्ता" के अलावा किसी अन्य चीज़ में बदलें, क्योंकि यह एक आरक्षित शब्द है और परेशानी हो सकती है!)
  6. संशोधित app/AppKernel.php, app/config/config.yml, app/config/routing.yml और app/config/security.yml FOS \ UserBundle दस्तावेज़ों के अनुसार संशोधित। संदर्भ के लिए:

    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 यह security.yml मैं का उपयोग करें Mahok \ SecurityBundle में .twig, {% 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 %} 
    

संपादित करें: जब स्थानीय होस्ट करने जा रहा/उदाहरण/app_dev.php/हैलो/उपयोगकर्ता (के रूप में "सा" में प्रवेश करने के बाद), मैं निम्नलिखित उत्पादन प्राप्त करें:

Hello User! 
* ROLE_SUPER_ADMIN 
* ROLE_USER 
+0

मैं कुछ घंटों में कोशिश करूंगा और मैं उत्तर – Stickly

+0

धन्यवाद पोस्ट करूंगा, लेकिन मेरे पास अन्य प्रश्न हैं। मेरी सुरक्षा में .yml, क्यों - {पथ: ^/व्यवस्थापक, भूमिका: ROLE_ADMIN} काम नहीं करता है? – Stickly

+0

मुझे लगता है कि यह पदानुक्रम के साथ आपकी समस्या से संबंधित है, लेकिन जैसा कि मैंने पहले ही लिखा है, मुझे आपके द्वारा प्रदान किए गए कोड स्निपेट में कुछ भी गलत नहीं मिल रहा है। Security.yml से अनावश्यक सामान को हटा रहा है (उदा। In_memory प्रदाता और सादे टेक्स्ट-एन्कोडर) आपकी समस्या के लिए संभावित स्रोतों को कम कर देता है। इसके अलावा आपको FOS \ UserBundle-Document के माध्यम से जाना चाहिए और जांचें कि क्या आपने गलती से एक कदम छोड़ा है या कोई गलती की है। उदाहरण के लिए, देखें कि क्या आप उदा। दस्तावेज़ \ उपयोगकर्ता, जो आसानी से तब हो सकता है जब आप अपने आईडीई में स्वत: पूर्ण पर भरोसा करते हैं। – dbrumann