2017-04-01 4 views
9

मेरा एप्लिकेशन उपयोगकर्ता भूमिकाओं के आधार पर सामग्री तक पहुंच की अनुमति देता है। मैंने प्रत्येक भूमिका के लिए राउटर गार्ड लिखा था। कुछ सामग्री भूमिका 1 या role2 या role3 के लिए उपयोग की अनुमति देते हैं। मुझे यह कैसे लिखना चाहिए कि सुविधा-routing.module.ts फ़ाइल में घोषणा सक्रिय कर सकते हैं? जैसा कि मैं समझता हूँ, अगर मैं लिखनाकोणीय 2 उसी पथ पर ओआर-रिलेशनशिप के साथ एकाधिक गार्ड कैसे लागू करें

canActivate:[Role1Guard, Role2Guard, Role3Guard] 

पहुँच मना कर दिया जाएगा, तो गार्ड के किसी भी झूठी देता है। लेकिन मेरे मामले में, अगर किसी भी गार्ड सही साबित होता है तो मुझे पहुंच की अनुमति देनी चाहिए। यह कैसे करना है? अग्रिम में बहुत धन्यवाद!

+1

आसान समाधान एक गार्ड उस खाते में 3 भूमिकाओं लेता है बनाने के लिए है, कि क्या मैं इस पल, Role1or2or3Guard के लिए क्या है, लेकिन मैं जहाँ मैं कर सकते हैं एक अच्छे समाधान खुशी होगी मेरे मौजूदा गार्ड को गठबंधन करें ... – Seb

+0

हाँ मैंने इस समाधान के बारे में भी सोचा था। एक मामले के लिए यह काम करेगा, और लागू करने के लिए बहुत आसान है। समस्या तब होती है जब आप इसे सामान्य बनाना चाहते हैं .... यदि आपके पास 5 भूमिकाएं हैं और प्रत्येक संयोजन संभव है, तो आपको सभी गार्ड वर्गों को लिखने के लिए रोबोट की आवश्यकता है ..... –

+1

हाँ मुझे पता है, मेरे पास एक ही समस्या है ... किसी के लिए आपको एक वास्तविक समाधान देने की प्रतीक्षा कर रहा है;) – Seb

उत्तर

1

हम इस मामले में क्या कर सकते हैं मास्टर गार्ड जो हमारी आवश्यकताओं के अनुसार एप्लिकेशन गार्ड को ट्रिगर करेगा जाहिर।

चेकआउट this दृष्टिकोण को समझने के लिए उत्तर दें।

मान लीजिए कि आप इसे लिंक के ऊपर से गुजर चुके हैं, इस मामले में दृष्टिकोण संपत्ति Route कक्षा में संशोधित करने के समान सरल हो सकता है।

कुछ इस तरह -

{ 
    path: "view2", 
    component: View2Component, 
    //attach master guard here 
    canActivate: [MasterGuard], 
    //this is the data object which will be used by 
    //masteer guard to execute guard1, guard 2, guard 3 & guard 4 
    data: { 
     trigger: { 
      operator: "OR", 
      guards: [ 
       GUARDS.GUARD1, 
       GUARDS.GUARD2, 
       GUARDS.GUARD3, 
       GUARDS.GUARD4 
      ] 
     } 
    } 
} 

और फिर उसके अनुसार सभी गार्ड आग operator ध्वज का उपयोग करें।

मुझे आशा है कि इस मदद करता है :)

1

आप OrGuard, की तरह कुछ लिख सकते हैं:

class OrGuard() { 
    guards: any[]; 
    constructor(...guards) { this.guards = guards } 

    canActivate() { 
    return this.guards.some(Boolean); 
    } 
} 

और इस तरह इसका इस्तेमाल:

canActivate:[new OrGuard(Role1Guard, Role2Guard, Role3Guard)] 

... बस एक विचार, वास्तविक क्रियान्वयन अलग हो सकता है, मैं कोशिश नहीं की (;

+5

यदि गार्ड की कोई निर्भरता है तो यह काम नहीं करेगा। उदाहरण के लिए यदि उन्हें HTTP अनुरोध करने की आवश्यकता है। एक सेवा या कक्षा कारखाना –

+0

@ अलुआन हद्दाद काम करेगा, क्या आप कृपया थोड़ा विस्तार कर सकते हैं? सेवा के साथ इसे कैसे करें और कक्षा कारखाने के साथ इसे कैसे करें? अग्रिम में बहुत धन्यवाद! –

+0

क्षमा करें, मैं बहुत व्यस्त हूं। –

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