2011-08-03 10 views
6

का अनुरोध करता है मैं JSF और PrettyFaces के लिए नया हूँ। तो अब तक मुझे पता चला है कि मैं PrettyFaces को दाएं .xhtml फ़ाइल के अनुरोध को "आगे" करने के लिए कॉन्फ़िगर कर सकता हूं। समस्या यह है कि, मैं (या एक उपयोगकर्ता, अगर वह मेरी फ़ोल्डर संरचना जानता है) भी फ़ाइल का अनुरोध कर सकते हैं।JSF और PrettyFaces - कैसे प्रत्यक्ष एक्सएचटीएमएल प्रतिबंधित करने के लिए

फ़ाइलें:: webbapp/mypage.xhtml

मैं जोड़ा निम्नलिखित लाइनों सुंदर-config.xml रहे हैं:

<url-mapping id="myPageId"> 
    <pattern value="/prettyurltomypage" /> 
    <view-id value="/mypage.xhtml" /> 
</url-mapping> 

PrettyFaces फ़िल्टर पर "अवरोधन करने कॉन्फ़िगर किया गया है/यह मेरा नमूना है "। फेस फ्रंट कंट्रोलर सभी " .xhtml" अनुरोधों को संसाधित करने के लिए कॉन्फ़िगर किया गया है। जब मैं अनुरोध करता हूं ...

http://localhost:8080/myapp/prettyurltomypage 

... evrything ठीक है। मेरी समस्या यह है कि मैं भी अनुरोध कर सकता हूं ...

http://localhost:8080/myapp/mypage.xhtml 

मैं .xhtml अनुरोधों को कैसे प्रतिबंधित कर सकता हूं? मेरा लक्ष्य जेएसएफ/सर्वर को डिफ़ॉल्ट 404 पेज देने के लिए है।

<rewrite match="/mypage.xhtml" substitute="/prettyurltomypage" redirect="301" /> 

क्या कोई अन्य (होशियार) रास्ता नहीं है:

मेरे समाधान (अभी तक) बहुत-config.xml में रीराइट नियम परिभाषित करने के लिए किया गया था?

उत्तर

6

यह अपने तैनाती डिस्क्रिप्टर में वेब संसाधनों के रूप में एक्सएचटीएमएल फ़ाइलें अंकन द्वारा किया जा सकता।
ऐसा करने के लिए, आप अपने web.xml को कुछ इस तरह जोड़ सकते हैं:

<security-constraint> 
    <display-name>Restrict direct access to XHTML files</display-name> 
    <web-resource-collection> 
     <web-resource-name>XHTML files</web-resource-name> 
     <url-pattern>*.xhtml</url-pattern> 
    </web-resource-collection> 
    <auth-constraint/> 
</security-constraint> 

आप वहाँ एक संक्षिप्त article Javalobby पर सुरक्षा प्रतिबंधों के बारे में अधिक पढ़ने के लिए चाहते हैं।

+0

@Christian Beikov से URL दर्ज 'यूआरएल-pattern' में अभिव्यक्ति से मेल खाता है तो आप एक HTTP 403, कोई बात नहीं क्या फिल्टर आप का उपयोग मिल जाएगा। एक साइड नोट के रूप में मैं उत्पादन वातावरण में इसके लिए एक सुरक्षा बाधा आधारित समाधान का उपयोग करता हूं, और अब तक मैं सीधे जेएसएफ पृष्ठों तक नहीं पहुंच सका। – BCsongor

0

निम्नलिखित मुद्दा देखें: http://code.google.com/p/prettyfaces/issues/detail?id=116

आशा इस की मदद से आप

+0

क्योंकि एक अनुरोध जो PrettyFaces-फ़िल्टर के माध्यम से चलाता है भेजा जाएगा और अंत में फ़ाइल के लिए अनुरोध हमेशा किया जाता है सुरक्षा प्रतिबंधों काम नहीं करेगा। एकमात्र समाधान मुझे पता है एक फिल्टर जो पहुँच डेनिस स्थापित कर रही है, लेकिन आप इस तथ्य है कि संसाधन अनुरोध भी चेहरे सर्वलेट के लिए परिभाषित मानचित्रण का उपयोग करेगा के बारे में पता होना चाहिए। –

+0

@BCsongor मैं इस सुरक्षा बाधा के साथ कुछ भी उपयोग नहीं कर सकते। Prettyfaces निश्चित रूप से .xhtml-files के अनुरोधों को अग्रेषित कर रहा है और उस वजह से फ़ाइलों को कहीं भी कॉल करना होगा। –

3

हाँ, अगर आप सीधे पृष्ठों तक पहुंच को अवरुद्ध करना चाहते हैं, तो शायद कस्टम सुरक्षा पैकेज की तरह कुछ उपयोग किए बिना जाने का सबसे अच्छा तरीका है - अन्यथा, यदि आप केवल यह सुनिश्चित करना चाहते हैं कि पृष्ठ सही तरीके से प्रस्तुत किए जाएं। आप वास्तव में अपने चेहरे सर्वलेट मैपिंग को .xhtml में बदल सकते हैं, जिसका अर्थ है कि जब लोग पृष्ठों तक पहुंचते हैं तो आपका स्रोत प्रकट नहीं होगा।

<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.faces</url-pattern> 
</servlet-mapping> 

आप क्रम में और अधिक जटिल पुनर्लेखन नियम क्या करने के लिए वास्तव में पृष्ठों को लॉक चाहते हैं, आप एक कस्टम पुनर्लेखन प्रोसेसर का उपयोग पर विचार करने और प्रोसेसर इंटरफ़ेस को लागू कर सकते हैं।

http://ocpsoft.com/docs/prettyfaces/3.3.0/en-US/html_single/#inbound_rewriting.options

कस्टम प्रोसेसर की पहुंच है HttpServletRequest और HttpServletResponse और इनबाउंड और आउटबाउंड पुनर्लेखन पर दोनों आह्वान: आप इस इंटरफेस के साथ और अधिक जटिल कर सकते हैं:

/** 
* Perform a rewrite operation on a given URL, utilizing any necessary information from the given {@link RewriteRule} 
* configuration object from which the processor was invoked. 
* 
* @author Lincoln Baxter, III <[email protected]> 
*/ 
public interface Processor 
{ 
    /** 
    * Process an inbound URL Rewrite request. This takes place when the request first comes in to the server and passes 
    * through {@link RewriteFilter} 
    */ 
    String processInbound(HttpServletRequest request, HttpServletResponse response, RewriteRule rule, String url); 

    /** 
    * Process an outbound URL Rewrite request. This takes place when a URL is passed in to 
    * {@link HttpServletResponse#encodeRedirectURL(String)}, and since most frameworks ensure the call to 
    * 'encodeRedirectUrl()' occurs automatically, can be assumed to occur whenever a URL would be rendered to HTML 
    * output. 
    */ 
    String processOutbound(HttpServletRequest request, HttpServletResponse response, RewriteRule rule, String url); 
} 

अन्यथा, तुम क्या कर रहे काम करेंगे, और OCPSoft तक पुनर्लेखन https://github.com/ocpsoft/rewrite (कौन PrettyFaces के पीछे भी कर रहे हैं) जारी की है, ऐसी स्थिति में आप एक साधारण भीतर का पुनर्लेखन नियम के साथ बहुत आसानी से कर सकता है:

package com.example; 
public class ExampleConfigurationProvider extends HttpConfigurationProvider 
{ 

    @Override 
    public int priority() 
    { 
    return 10; 
    } 

    @Override 
    public Configuration getConfiguration(final ServletContext context) 
    { 
    return ConfigurationBuilder.begin() 
     .defineRule() 
     .when(Direction.isInbound().and(DispatchType.isRequest()).and(Path.matches(".*\\.xhtml")).andNot(Path.matches(".*javax.faces.resource.*"))) 
     .perform(SendStatus.code(404)); 
    } 
} 

यह पुनर्लेखन नियम .XHTML फाइलों पर भीतर का HTTP अनुरोध करने के लिए उपयोग को अवरुद्ध कर देगा, जबकि अभी भी अग्रेषित की अनुमति देता है, या त्रुटि, या async अनुरोधों। यह भी एक कार्यात्मक राज्य है, जो मामला नहीं है अगर आप जावा ईई सुरक्षा बाधा के रूप में एक और जवाब में सुझाव का प्रयोग JSF2 संसाधन एपीआई छोड़ देंगे।

आशा इस मदद करता है, लिंकन

+0

हे! आपका बहुत बहुत धन्यवाद! – Alebon

+0

मेरी खुशी :) खुशी है कि मैं सहायता का हो सकता है! – Lincoln

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