2011-06-10 15 views
19

मैं जर्सी का उपयोग कर अपनी आरईएसटी सेवाओं में कस्टम प्राधिकरण को कार्यान्वित करना चाहता हूं। यह कस्टम प्रमाणीकरण विधियों के साथ-साथ वास्तविक पैरामीटर पर एनोटेशन का निरीक्षण करता है जो विधि प्राप्त करता है।जर्सी संसाधन में वास्तविक पैरामीटर मान प्राप्त करना FilterFactory

मेरे jax-रु एनोटेट विधि लगता है:

@GET 
@Path("customers") 
@Requires(Role.CustomerManager) 
public Customer getCustomer(@ParseFromQueryString @CheckPermission final Customer customer) { 
    // ... 
} 

@ParseFromQueryString एक एनोटेशन कि जर्सी संकेत करता है (एक इंजेक्शन प्रदाता के माध्यम से) एक क्वेरी स्ट्रिंग से एक Customer unmarshall है।

public class QueryStringCustomerInjectable implements Injectable<Customer> { 
    public Customer getValue() { 
    final Customer customer = new Customer(); 
    // ... a UriInfo was injected using the @Context annotation 
    // ... extract parameters from QueryString and use setters 
    return customer; 
    } 
} 

@CheckPermission एनोटेशन अपने कस्टम authoriser इंगित करता है कि अनुमतियों एक ग्राहक पर जांच की जानी हैं: जैसे कि के लिए कोड लग रहा है। कुछ उपयोगकर्ताओं के पास कुछ ग्राहकों की जानकारी तक पहुंच है। इसी तरह, @Requires एनोटेशन एक भूमिका निभाता है जो चालक के पास होना चाहिए। ये जावा की सुरक्षा भूमिकाएं नहीं हैं (स्ट्रिंग्स), बल्कि, वे enum मान हैं।

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

मेरे सिर के शीर्ष पर, मैं दो काम arounds के बारे में सोच सकते हैं:

  1. एक विधि इंटरसेप्टर Guice + जर्सी का उपयोग कर।
  2. इस तर्क को QueryStringCustomerInjectable पर कोड करें, लेकिन यह थोड़ा सा मैला लगता है। यह बहुत अधिक कर रहा है।

फिर भी, मैं वास्तव में केवल जर्सी/जेएक्स-आरएस का उपयोग करके ऐसा करना चाहता हूं। मुझे लगता है कि मैं बहुत करीब हूँ!

विचार? संकेत दिए गए?

धन्यवाद!

+0

मुझे अभी भी ऐसा करने का एक अच्छा तरीका नहीं मिला है ... तो यह या तो गुइस का उपयोग कर रहा है, या सीएक्सएफ का उपयोग कर रहा है, जो इंटरसेप्टर प्रदान करता है और आपके स्वयं के आवेदकों को प्रदान करने का एक तरीका प्रदान करता है। – chahuistle

+0

क्या आपने एओपी में देखा है या केवल वर्कअराउंड 1 के लिए सर्वलेट फ़िल्टर का उपयोग किया है? – hisdrewness

+0

क्या आपने 'कंटेनररक्वेटफिल्टर' का उपयोग करके और ग्राहक को इंजेक्शन देने का प्रयास किया है? मुझे यकीन नहीं है कि क्या @ बीनपाराम संसाधनों तक सीमित हैं या यदि उन्हें फिल्टर में भी इंजेक्शन दिया जा सकता है, लेकिन मुझे लगता है कि फिल्टर प्रीमैच नहीं है, तो इसे काम करना चाहिए। –

उत्तर

0

ग्राहक deserialization के लिए आप javax.ws.rs.ext.ParamConverterProvider को लागू कर सकते हैं और इसे जर्सी में पंजीकृत कर सकते हैं। फिर आप इसे @QueryParam ("ग्राहक") के साथ अपने तरीकों से इंजेक्ट कर सकते हैं। यह थोड़ा अधिक लचीला है क्योंकि आप इसे @ बीनपाराम या @ पाथपाम एनोटेशन के साथ भी इस्तेमाल कर सकते हैं।

फिर आप ContainerRequestFilter का उपयोग कर सकते हैं। संदर्भ के रूप में देखें कि जर्सी Oauth1 कैसे करता है उदाहरण के लिए OAuth1ServerFilter। अगली चीज़ जो आप कर सकते हैं वह एक ऐसी सुविधा बनाने के लिए है जो नए बनाए गए फ़िल्टर को पंजीकृत करे (संदर्भ के लिए Oauth1ServerFeature देखें - मुझे अभी स्रोत कोड नहीं मिला)।

शुभकामनाएं!

0

अपने स्वयं के सर्वलेट फ़िल्टर का उपयोग क्यों नहीं करें उदा।

public class YourFilter implements Filter { 
    ... 
    @Override 
public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain filterChain) throws IOException, ServletException { 

    // HttpServletRequest httpReq = (HttpServletRequest) request; 
    // HttpServletResponse httpResp = (HttpServletResponse) response; 

    // HttpServletRequest httpReq = (HttpServletRequest) request; 
    // HttpServletResponse httpResp = (HttpServletResponse) response; 
    // ..... httpReq.getUserPrincipal(); 


    // then set what you need using ThreadLocal and use it inside your resource class 

    // do not forget to call 
    filterChain.doFilter(request, response); // at the end of this method 

} 

अंतिम चरण आपके सर्वलेट फ़िल्टर को पंजीकृत करना है। यह वेब ऐप के web.xml

का उपयोग करके किया जाता है यह जर्सी संसाधन के अंदर वास्तविक कोड से पहले आपके HTTP अनुरोधों को रोक देगा।

1

विधि के बारे में सारी जानकारी को संभालने के लिए आपको Filters या Interceptors का उपयोग करना चाहिए। see Jersey Filter and Interceptors

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