2011-06-29 9 views
13

किसी उपयोगकर्ता को कार्रवाई करने से रोकने के लिए।सही तरीके से उपयोग करने के लिए isUserInRole (भूमिका)

  1. उदाहरण 1: भूमिका "व्यवस्थापक" केवल भूमिका कार्रवाई को नष्ट करने की अनुमति है।
  2. उदाहरण 2: "अतिथि" से अलग कोई भी भूमिका क्रियाएं कर सकती है।

    public String delete() { 
    if(FacesContext.getCurrentInstance().getExternalContext().isUserInRole("administrator"){ 
        //.....the action to perform 
    } 
    return "Denied"; 
    } 
    

    मैं मैं एनोटेशन EJB के @RolesAllowed() का उपयोग अभी तक मैं EJB लेकिन ManagedBeans उपयोग नहीं कर रहा पाती:

कोई वास्तविक मामले में, मैं इस किया है। तो सवाल यह है: क्या एक ही समय में कई भूमिकाओं का उपयोग करने का कोई तरीका है? कुछ कामकाज! उदाहरण: यदि 3 भूमिकाओं (व्यवस्थापक, मॉडरेटर, प्रबंधक) को एक क्रिया की अनुमति दी जानी चाहिए। मैं क्या करने के लिए बाध्य कर रहा हूँ:

if (FacesContext.getCurrentInstance().getExternalContext().isUserInRole("administrator") 
    || FacesContext.getCurrentInstance().getExternalContext().isUserInRole("manager") 
    || .....) { 
    //.... 
} 

और यह सब तरीकों पर पुन: पेश करने के लिए एक दर्द है। तरीकों :(के सैकड़ों की तरह कुछ

उत्तर

28

को दृश्य पक्ष में नियंत्रित करने की आवश्यकता है। क्या आप इसे अपने आप को बहुत परेशान नहीं करते हैं आप किसी साइट पर एक बटन देखते हैं जिसके लिए आपके पास प्रेस करने के पर्याप्त अधिकार नहीं हैं और इस तरह आप ऐसा करते समय एक डरावनी त्रुटि पृष्ठ प्राप्त करते हैं?

केवल दृश्य पक्ष में बटन प्रस्तुत करें जब उपयोगकर्ता की आवश्यक भूमिका हो, अन्यथा इसे पूरी तरह छुपाएं।

<h:commandButton value="Delete" action="#{bean.delete}" 
    rendered="#{request.isUserInRole('administrator')}" /> 

यह (सीएसआरएफ) हैक के प्रति संवेदनशील नहीं है क्योंकि जेएसएफ लागू अनुरोध मान चरण के दौरान एक बार फिर से स्थिति की जांच करता है।

एकाधिक स्थितियों का उपयोग करने और एक ही दृश्य में इसे एक से अधिक बार दोहराने के लिए, इसे संक्षिप्त उपनाम देने के लिए <c:set> का उपयोग करने पर विचार करें। आप इसे कुछ मास्टर टेम्पलेट के शीर्ष पर भी रख सकते हैं ताकि यह सभी बाल टेम्पलेट्स के लिए उपलब्ध हो।

<c:set var="isPowerUser" value="#{request.isUserInRole('manager') or request.isUserInRole('administrator')}" scope="request" /> 
... 
<h:commandButton rendered="#{isPowerUser}" /> 
... 
<h:commandButton rendered="#{isPowerUser}" /> 
+0

सामान्य रूप से स्मार्ट अभ्यास! दरअसल, यह डैनिड संदेश प्राप्त करने के लिए बहुत परेशान है। मैं एडमिन पैनल को प्रदर्शित करने के लिए पहले से ही रेंडर एट्रिब्यूट का उपयोग करता हूं यदि भूमिका व्यवस्थापक है और इस तरह से। दृश्य में करने से आपके द्वारा पाठ्यक्रमों का उल्लेख किया गया है, लेकिन मुद्दा बनी हुई है: मुझे एनीमेशन करने के लिए बाध्य किया गया है प्रत्येक भूमिका अलग-अलग या ऑपरेटर का उपयोग कर रही है! क्या मैं गलत हूं? – Hanynowsky

+1

यह # # {facesContext.externalContext.isUserInRole ('व्यवस्थापक')} से कम से कम संक्षिप्त है} :) यदि आपको उसी स्थिति को एक ही बार में दोहराना होगा देखें, फिर आप इसे उपनाम देने के लिए '' का भी उपयोग कर सकते हैं। अद्यतन उत्तर भी देखें। – BalusC

+0

धन्यवाद बलुस! नई भूमिकाओं को परिभाषित करने और मैंगड बीन में क्रिया विधियों को हैक करने से बचने के लिए ui: param के साथ मास्टर टेम्पलेट का उपयोग करना बुद्धिमानी है। यह अब मेरे लिए ठीक काम करता है, मुझे बस इतना करना है कि दृश्य में आवश्यक नई भूमिका उपनाम लागू करें। @Bozho विधि भी मेरे लिए ठीक काम कर रही है अगर मैं वास्तव में अस्वीकृत पृष्ठ को गैर अधिकृत उपयोगकर्ता को दिखाना चाहता हूं। – Hanynowsky

7

आप छोटा कर सकते हैं कि एक उपयोगिता विधि करने के लिए तर्क को ले जाकर:

public class AuthorizationUtils { 
    public static boolean isUserInRoles(String[] roles) { 
     for (String role : roles) { 
      if (FacesContext........isUserInRole(role)) { 
       return true; 
      } 
     } 

     return false; 
    } 
} 

और फिर साथ यह आह्वान:

if (AuthorizationUtils.isUserInRoles(new String[] {"administrator", "moderator"})) { 
    .. 
} 

आप CDI का उपयोग कर रहे हैं, तो आप एक इंटरसेप्टर बना सकते हैं जो @RolesAllowed एनोटेशन

+0

जो मेरे प्रश्न का उत्तर है। जबकि @ बालुससी ने एक बेहतर अभ्यास दिया। तो क्या मैं हैकिंग एक्शन विधियों के बजाय दृश्य में अपनी उपयोगिता विधि का उपयोग कर सकता हूं? कुछ ऐसा: '' मुझे लगता है कि मैं बकवास कह रहा हूं !! नहीं? – Hanynowsky

+0

मुझे यकीन नहीं है कि ईएल इस स्थिर आमंत्रण की अनुमति देगी, लेकिन आप एक प्रबंधित कर सकते हैं बीन को 'ऑथबीन' कहा जाता है और उस विधि को वहां रखा जाता है। – Bozho

+0

उपयोगिता विधि एक आकर्षण की तरह काम करती है! क्या आपको दिमाग है अगर मैं @ बालुससी उत्तर स्वीकार करता हूं क्योंकि यह वही है जिसे मैं अभी अपना रहा हूं? – Hanynowsky

1

@ Mediterran81: तो बुनियादी तौर पर आप सेम के विधि आधारित प्राधिकरण समाधान के लिए देख रहे हैं ... कैसे आप अपने प्रबंधित सेम instantiating कर रहे हैं? आप एक सरल XML स्वरूप लागू करने के लिए पसंद कर सकते हैं: -

<bean class=""> 
<method name=""> 
    <role> xyz</role> 
</method> 
</bean> 

इस एक्सएमएल उपयोगिता वर्ग द्वारा पढ़ा और फिर केवल एक चीज आपको बस इतना करना होगा उपयोगिता के स्थिर विधि कॉल करने के निर्धारित करने के लिए विधि निष्पादित करने के लिए अनुमति दी है अगर है लो।

+0

ओपी जेएसएफ का उपयोग कर रहा है। – BalusC

+0

मैंने पहले एक्सएमएल का उपयोग करने के बारे में सोचा लेकिन मुझे आदेश नहीं दिया गया है, और मुझे चीजों को प्राप्त करने के लिए न्यूनतम कोडिंग का उपयोग करने के लिए कहा जाता है। जेएसएफ पर्यावरण में, मुझे जेएसएफ दृश्य क्षमताओं का उपयोग करके दृश्य पर खेलने के लिए कहा जाता है। हालांकि, मैंने आपका जवाब वोट दिया क्योंकि मैं विधि भूमिका प्राधिकरण प्राप्त करने के एक स्वच्छ और चिकनी तरीके का वर्णन करता हूं। धन्यवाद ag112 – Hanynowsky

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

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