2012-01-31 17 views
15

में लॉग इन नहीं किए गए उपयोगकर्ता का ROLE प्राप्त करें मैं जानना चाहता हूं कि उपयोगकर्ता को यह कब पता चलेगा कि उपयोगकर्ता को कब दिया गया है जब यह वर्तमान उपयोगकर्ता नहीं है।TWIG Symfony2

मैं वर्तमान उपयोगकर्ता के लिए इस कोड का उपयोग:

{% if is_granted('ROLE_USER') %} 
    <a href="...">Delete</a> 
{% endif %} 

लेकिन मैं ohter उपयोगकर्ताओं उस पल में लॉग इन नहीं हैं के साथ एक ही बात करने के लिए सक्षम होना चाहते हैं। धन्यवाद।

संपादित करें: वास्तव में मुझे लगता है कि प्रमाणीकृत नहीं होने वाले उपयोगकर्ता की परीक्षण की जांच करने के लिए सीधा तरीका नहीं है। तो मैंने इसे सीधे टिग टेम्पलेट में किया, परीक्षण करें कि कोई उपयोगकर्ता व्यवस्थापक है या नहीं, फिर var सेट करें। (मेरे सवाल में मैं उपयोगकर्ताओं की सूची में कैसे करना खोज रहा था।)

{% set from_user_is_admin = false %} 
{% for role in from_user.getRoles() %} 
    {% if role == 'ROLE_ADMIN' %}{% set from_user_admin = true %}{% endif %} 
    {% if role == 'ROLE_SUPER_ADMIN' %}{% set from_user_admin = true %}{% endif %} 
{% endfor %} 
{% if from_user_admin == false %}THIS USER IS NOT ADMIN{% endif %} 

उत्तर

15

मुझे लगता है कि अगर आप उपयोगकर्ता इकाई में एक isGranted समारोह कार्यान्वित बहुत आसान होता:

Class User implements UserInterface { 
    ... 
    public function isGranted($role) 
    { 
     return in_array($role, $this->getRoles()); 
    } 
} 

अब आप आसानी से अपने आवेदन के हर परत में दी गई भूमिकाओं के लिए देख सकते हैं। PHP में:

$user->isGranted("USER_ADMIN") 

या टहनी में:

user.granted("USER_ADMIN") 

आप वर्तमान उपयोगकर्ता के लिए एक भूमिका की जांच करने की जरूरत है, तो आप टहनी में ऐसा कर सकते हैं:

app.user.granted("USER_ADMIN") 

नोट: परिवर्तनीय "ऐप" विश्व स्तर पर परिभाषित किया गया है।

नोट 2: यदि आप इसे अपने ऐप के सुरक्षित क्षेत्र के बाहर उपयोग करते हैं, तो यह कोड अपवाद फेंक सकता है, क्योंकि app.user पूर्ण होगा।

+0

हां! सिम्फनी 2 सीखने के कई महीनों के बाद मैंने यही किया। – Rmannn

+12

यह काम नहीं कर सकता है, क्योंकि भूमिका विरासत – nick4fake

+2

देखें http://stackoverflow.com/a/24323223/877323 यदि आप भूमिका विरासत को संभालना चाहते हैं और न केवल 'सख्त' भूमिका –

9

आप के साथ "नहीं" ऊपर के समान कथन का उपयोग कर सकते हैं:

{% if not is_granted('ROLE_USER') %} 
    <a href="...">Delete</a> 
{% endif %} 

वरना बयान का उपयोग करें:

{% if is_granted('ROLE_USER') %} 
    <a href="...">Delete</a> 
{% else %} 
    {# something else for guest user, not logged in #} 
{% endif %} 
+3

हाँ मुझे पता है कि funtion है , लेकिन is_granted वर्तमान उपयोगकर्ता का परीक्षण कर रहा है। जिस चीज को मैं जानना चाहता हूं वह वही काम कर रहा है जो एक उपयोगकर्ता ऑब्जेक्ट है जो वर्तमान उपयोगकर्ता नहीं है। मैंने अपना प्रश्न संपादित करने के तरीके को संपादित करने के लिए संपादित किया। फिर भी धन्यवाद। – Rmannn

+3

@ लेंडा आपने प्रश्न – Nanocom

+0

+1 * उत्कृष्ट * कार्यान्वयन नहीं पढ़ा! – mate64

4

आप या तो एक टहनी macro, या एक टहनी समारोह बनाना चाहिए।

एक macro बनाना, बहुत सरल है अपने कोड का उपयोग:

{% macro admin_status(from_user) %} 
    {% set from_user_is_admin = false %} 
    {% for role in from_user.getRoles() %} 
     {% if role == 'ROLE_ADMIN' %}{% set from_user_admin = true %}{% endif %} 
     {% if role == 'ROLE_SUPER_ADMIN' %}{% set from_user_admin = true %}{% endif %} 
    {% endfor %} 
    {% if from_user_admin == false %}THIS USER IS NOT ADMIN{% endif %} 
{% endmacro %} 

फिर आप यह एक ही फाइल में {% _self.admin_status(user) %} के रूप में उपयोग कर सकते हैं। आप इसे एक अलग फ़ाइल में भी ले जा सकते हैं, और इसका उपयोग प्राप्त करने के लिए ट्विग के import टैग का उपयोग कर सकते हैं।

एक ट्रिग फ़ंक्शन बनाना बेहतर विकल्प है, विवरण के लिए extending twig देखें। यह एक नियमित रूप से समारोह, कि टहनी से कहा जा सकता है बनाने के लिए नीचे फोड़े, इसलिए इस तरह कोड संभव हो जाता है:

{% if user_is_admin(user) %} 

तुम भी enabling custom twig extensions को पढ़ने के लिए की आवश्यकता होगी।

+0

डब्ल्यूओ, बहुत बहुत धन्यवाद, मैं उस कोड को एक टिग टेम्पलेट में डाल सकता हूं, इसे शामिल कर सकता हूं, फिर कोड का पुन: उपयोग कर सकता हूं! – Rmannn

0

मैं इसे इस तरह से किया था, वैश्विक टहनी फ़ाइल में इस टुकड़ा, में मेरे मामले layout.html.twig

{% set is_admin = false %} 
{% if app.security.token.user.roles is iterable %} 
    {% for role in app.security.token.user.roles %} 
     {% if role == 'ROLE_ADMIN' or role == 'ROLE_SUPER_ADMIN' %} 
      {% set is_admin = true %} 
     {% endif %} 
    {% endfor %} 
{% endif %} 

तो मैं कहीं भी उपयोग कर सकते हैं

{% if is_admin %}....{% endif %} 
संबंधित मुद्दे