6

मैं अपनी रीस्टफुल वेब-सेवा में मूलभूत प्रमाणीकरण जोड़ने का प्रयास कर रहा हूं। वर्तमान में मेरे पास अपाचे टॉमकैट 6.0 सर्वर के लिए बेसिक प्रमाणीकरण है, लेकिन मुझे अपनी वेब-सेवा को वेबस्पेयर एप्लिकेशन सर्वर वर्क पर तैनात करने की आवश्यकता है। 6.1 साथ ही मुझे वेबस्पेयर पर चलने वाले बेसिक प्रमाणीकरण में समस्याएं आ रही हैं।क्या बेसिक प्रमाणीकरण को लागू करने के लिए कोई सर्वर अज्ञेय तरीका है?

क्या HTTP अनुरोध के प्रमाणीकरण शीर्षलेखों की जांच करने के लिए जावा में कोई तरीका है और यदि उपयोगकर्ता नाम/पासवर्ड प्रदान किया गया है (बेस 64 एन्कोडिंग में) उपयोगकर्ता को एक नए उपयोगकर्ता नाम/पासवर्ड में प्रवेश करने के लिए ज्ञात खाता बल से मेल नहीं खाता है?

मैंने वसंत सुरक्षा को लागू करने का प्रयास किया है, लेकिन चूंकि मेरी परियोजना पूरी तरह से वसंत के बिना बनाई गई थी, इसलिए यह काम करने के लिए एक बड़ा दर्द रहा है, और मैं अपनी सरल समस्या के लिए एक सरल समाधान खोजने का प्रयास कर रहा हूं।

जिन तकनीकों का मैं वर्तमान में उपयोग कर रहा हूं उनमें शामिल हैं: जावा, जर्सी/जेएक्स-आरएस, मैवेन प्लगइन के साथ ग्रहण।

+0

http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.express.doc/info/exp/ae/twbs_auwschta.html ? –

+0

@Marc मैंने उस पीडीएफ को देखा है और यह उदाहरण सर्वर के लिए बेहद विशिष्ट है। मैं पहले से स्थापित वेबस्पेयर के साथ एक पूरी तरह से अलग सर्वर का उपयोग कर रहा हूं (मेरे पास इसका कोई नियंत्रण नहीं है) और ये कॉन्फ़िगरेशन उस सर्वर से मेल नहीं खाते हैं जिसे मैं तैनात करने का प्रयास कर रहा हूं। –

उत्तर

9

आपको servlet filter सेट करने में सक्षम होना चाहिए जो आपके आरईएसटी हैंडलर से पहले निष्पादित हो जाता है, "प्राधिकरण" अनुरोध हेडर, base 64 decodes का निरीक्षण करता है, उपयोगकर्ता नाम और पासवर्ड निकालता है, और सत्यापित करता है। इस तरह कुछ:

public void doFilter(ServletRequest req, 
        ServletResponse res, 
        FilterChain chain) { 
    if (request instanceof HttpServletRequest) { 
    HttpServletRequest request = (HttpServletRequest) req; 
    String authHeader = Base64.decode(request.getHeader("Authorization")); 
    String creds[] = authHeader.split(":"); 
    String username = creds[0], password = creds[1]; 
    // Verify the credentials here... 
    if (authorized) { 
     chain.doFilter(req, res, chain); 
    } else { 
     // Respond 401 Authorization Required. 
    } 
    } 
    doFilter(req, res, chain); 
} 

सभी सर्वलेट कंटेनरों के पास फ़िल्टर श्रृंखला को कॉन्फ़िगर करने का एक मानक तरीका है।

+0

यह पूरी तरह से काम किया! धन्यवाद। –

4

मायरिक्स उत्तर के आधार पर पूर्ण कार्यान्वयन।

import java.io.IOException; 

import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.commons.lang.StringUtils; 

import sun.misc.BASE64Decoder; 

public class AuthenticationFilter implements Filter { 

    private static final String AUTHORIZATION_HEADER_NAME = "Authorization"; 
    private static final String WWW_AUTHENTICATE_HEADER_NAME = "WWW-Authenticate"; 
    private static final String WWW_AUTHENTICATE_HEADER_VALUE = "Basic realm=\"Default realm\""; 
    private static final String BASIC_AUTHENTICATION_REGEX = "Basic\\s"; 
    private static final String EMPTY_STRING = ""; 
    private static final String USERNAME_PASSWORD_SEPARATOR = ":"; 
    private static final BASE64Decoder DECODER = new BASE64Decoder(); 

    public void init(FilterConfig arg0) throws ServletException { 
    } 

    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 

     HttpServletRequest httpReq = (HttpServletRequest) req; 
     HttpServletResponse httpRes = (HttpServletResponse) res; 

     String authHeader = httpReq.getHeader(AUTHORIZATION_HEADER_NAME); 

     if (authHeader == null) { 
      this.requestAuthentication(httpRes); 
      return; 
     } 

     authHeader = authHeader.replaceFirst(BASIC_AUTHENTICATION_REGEX, EMPTY_STRING); 
     authHeader = new String(DECODER.decodeBuffer(authHeader));  

     if (StringUtils.countMatches(authHeader, USERNAME_PASSWORD_SEPARATOR) != 1) { 
      this.requestAuthentication(httpRes); 
      return;   
     } 

     String[] creds = authHeader.split(USERNAME_PASSWORD_SEPARATOR); 
     String username = creds[0]; 
     String password = creds[1];   

     //TODO: implement this method 
     if (!authenticatedUser(username, password)) { 
      this.requestAuthentication(httpRes); 
      return; 
     } 

     chain.doFilter(req, res); 
    } 

    private void requestAuthentication(HttpServletResponse httpRes) { 

     httpRes.setHeader(WWW_AUTHENTICATE_HEADER_NAME, WWW_AUTHENTICATE_HEADER_VALUE); 
     httpRes.setStatus(HttpServletResponse.SC_UNAUTHORIZED); 
    } 

    public void destroy() { 
    } 
} 
संबंधित मुद्दे

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