2013-03-12 29 views
9

मैं निर्देश लिखने की कोशिश कर रहा हूं उपयोगकर्ता अनुमतियों का मूल्यांकन करेगाकोणीय जेएस - अनुमति निर्देश

उपयोगकर्ता मामले में (ठीक काम कर रहा किया,) दिए गए सामग्री को देखने के लिए

  1. सामग्री प्रदर्शित नहीं किया जाएगा अनुमति के निर्देश अंदर नियंत्रकों से

  2. अनुरोध करने के निकाल दिया नहीं होगा अनुमति नहीं है।

उदाहरण:

नियंत्रक:

function MyController ($scope){ 
    // performing imediately server request, witch is allowed only for admin 
    // therefore i will get error when non admin user access this page 
} 

अनुमति के निर्देश:

return { 
     priority: 1000, 
     restrict: 'E', 
     link: (scope, element, attrs) => { 
      var permission = attrs.permission; 

      if (/*evaluating permission*/) { 
       // user has permission, no work for me 
       return; 
      } 

      element.remove(); 
     } 
    }; 

सभी एक साथ:

<permission permission="isAdmin"> 
    <div ng-controller="MyController"> 
    </div> 
</permission> 

यह संस्करण डोम से तत्वों को हटा रहा है, लेकिन MyController में अनुरोध अभी भी निष्पादित हो जाता है। बेशक, मैं MyController में अनुमतियों की जांच कर सकता हूं, लेकिन मैं नहीं चाहता हूं।

सहायता के लिए धन्यवाद।

+0

कृपया हमें बताएंगे कि कैसे आप अपने $ http अनुरोध कर रहे हैं। –

+0

या एक jsfiddle बनाओ। मुझे लगता है कि मुझे पता है कि आपकी समस्या क्या है लेकिन यह सुनिश्चित करने के लिए अपने अधिक कोड देखना चाहते हैं। –

+0

2 रे: यह सिर्फ एक मानक $ http.post '$ http.post (पता, डेटा) .success (succCall) है। आतंक (errCall);' [jsfiddle] (http://jsfiddle.net/sdYgp/2/) मैं नहीं देखता कि यह कैसे प्रासंगिक है। मुझे पता चला है कि संकलन कार्यों में तत्व को हटा रहा है, लेकिन मुझे यकीन नहीं है कि यह अच्छा समाधान है या नहीं। – klesta

उत्तर

1

मैं एक और दृष्टिकोण की कोशिश की और संकलन समारोह में तत्व को हटाने डाल दिया। लॉग के अनुसार, इसे नियंत्रक से पहले निष्पादित किया जाता है, इसलिए यह सही जगह है। वैसे भी अनुरोध अभी भी निकाल दिया गया था। इसलिए मैंने एक अंधेरे शॉट तत्व तत्वों को हटाने की कोशिश की (मुझे पता है, यह समझ में नहीं आता है, तत्व को हटाने पर्याप्त होना चाहिए और बच्चों को भी हटा देना चाहिए)।

लेकिन यह काम किया!

compile: function(element) { var children = element.children(); children.remove(); element.remove(); }

यह काम कर रहा है, लेकिन मुझे यकीन है कि नहीं यह कितना ठीक है कर रहा हूँ (जैसे भविष्य संस्करण आंग।)

+0

मुझे एक ही समस्या का सामना करना पड़ रहा है, क्या आप पूरे कोड को पोस्ट कर सकते हैं? क्या आपने लिंक फ़ंक्शन को कुछ संशोधित किया है, या आपने नीचे उन पंक्तियों को अभी जोड़ा है? –

-1

यदि मैं आप थे तो मैं सर्वर पर फोन करूँगा और जांच सकता हूं कि वे पहुंच के लिए अधिकृत हैं या नहीं।

निर्देश के साथ ऐसा करना वास्तव में समझ में नहीं आता है।

निर्देश आम तौर पर डोम में हेरफेर करने के लिए होते हैं और यह प्राधिकरण पुष्टि आमतौर पर नियंत्रक में संभाली जानी चाहिए और उसके बाद उस घटना को ट्रिगर करने का नतीजा होगा।

फिर आपका निर्देश उस घटना के लिए सुन रहा है और यदि वे सर्वर से पहुंच प्राप्त करते हैं तो डोम में हेरफेर करें।

अन्यथा कोई भी आसानी से जो कुछ भी चाहता था उसे इंजेक्ट कर सकता है और अपना व्यवस्थापक पैनल देख सकता है।

यदि आपको यकीन नहीं है कि मेरा मतलब क्या है, तो मुझे बताएं कि अगर आपको मेरी आवश्यकता है तो मैं जवाब का विस्तार कर सकता हूं।

+0

अच्छी तरह से सर्वर पक्ष सुरक्षित है ... जब अनधिकृत उपयोगकर्ता अनुरोध करता है, तो 'कोई अधिकार नहीं' जैसे उत्तर हैं। आपका तरीका अपेक्षाकृत सरल कार्य के लिए बहुत अधिक प्रयास की तरह दिखता है :)। नियंत्रकों में अनावश्यक अनुमति कोड। नियंत्रण के लिए उपयोगकर्ता अधिकार निर्धारित करने के लिए गुणा अनुरोध ... शायद मुझे यह सही नहीं मिल रहा है। – klesta

+0

-1 निर्देश का उपयोग सही अर्थ बनाता है। यह देखते हुए कि सर्वर संरक्षित किया गया है, आपको अभी भी विशेषाधिकार के आधार पर यूआई में चीजों को छिपाने/दिखाने की जरूरत है। इसे सुविधाजनक बनाने के लिए निर्देश का उपयोग करना पूरी तरह उपयुक्त है। –

+0

यूप गलत ने अपने प्रश्न को समझ लिया। मैंने सोचा कि वह सिर्फ यह जानना चाहता था कि उसकी अनुमतियों का मूल्यांकन कैसे किया जाए, उसे एहसास नहीं हुआ कि वह केवल ग्राहक पक्ष का जिक्र कर रहा था। इस उत्तर के आधार पर –

1

आपकी समस्या यह है कि लिंक फ़ंक्शन निष्पादित होने से पहले नियंत्रक को हमेशा बुलाया जाएगा। this fiddle देखें।

function MyCtrl($scope) { 
    console.log('in controller'); 
} 

myApp.directive('permission', function() { 
    return { 
     restrict: 'E', 
     link: function(scope, element, attrs) { 
      console.log('in link'); 

लॉग दिखाता है:

in controller 
in link 
+0

मैंने एक और दृष्टिकोण की कोशिश की और ** संकलन ** समारोह में तत्व को हटाने के लिए। लॉग के अनुसार, इसे नियंत्रक से पहले निष्पादित किया जाता है, इसलिए यह सही जगह है। वैसे भी अनुरोध अभी भी निकाल दिया गया था। इसलिए मैंने एक अंधेरे शॉट तत्व तत्वों को हटाने की कोशिश की (मुझे पता है, यह समझ में नहीं आता है, तत्व को हटाने पर्याप्त होना चाहिए और बच्चों को भी हटा देना चाहिए)। लेकिन यह काम किया! 'संकलन: कार्य (तत्व) {var बच्चे = element.children(); children.remove(); element.remove(); } '- आप इस पर क्या कहते हैं? यह काम कर रहा है, लेकिन मुझे यकीन नहीं है कि यह कितना ठीक है (उदाहरण के लिए भविष्य संस्करण एंग।) – klesta

+0

@klesta, element.remove() संकलन समारोह में मेरे लिए काम करता है: [fiddle] (http: // jsfiddle। शुद्ध/mrajcok/MFHet/2 /)। अगर मैं आपके सामान्य दृष्टिकोण को समझता हूं, तो इसमें बड़ी समस्याएं होती हैं क्योंकि कोई आपकी जावास्क्रिप्ट को संशोधित कर सकता है और उन चीज़ों तक पहुंच प्राप्त कर सकता है जिनके पास पहुंच नहीं होनी चाहिए। –

+0

अच्छी तरह से वे इसे संशोधित कर सकते हैं और उदाहरण के लिए व्यवस्थापक अनुभाग देख सकते हैं, लेकिन उन्हें कुछ भी करने की अनुमति नहीं दी जाएगी क्योंकि सर्वर उन्हें – klesta

संबंधित मुद्दे