2011-06-15 22 views
6

Tôi đang cố thêm xác thực BASIC vào dịch vụ web RESTful của mình. Hiện tại tôi có xác thực BASIC cho máy chủ Apache Tomcat 6.0, nhưng tôi cần triển khai dịch vụ web của mình trên máy chủ ứng dụng WebSphere ver. 6.1 là tốt và tôi gặp sự cố khi chạy xác thực BASIC trên WebSphere.Có cách nào để máy chủ thực thi xác thực BASIC không?

Có cách nào trong Java để kiểm tra tiêu đề xác thực của yêu cầu HTTP và nếu tên người dùng/mật khẩu được cung cấp (trong mã hóa Base64) không khớp với tài khoản đã biết để người dùng nhập tên người dùng/mật khẩu mới không?

Tôi đã thử triển khai Spring Security, nhưng vì dự án của tôi đã hoàn toàn không có Spring nên tôi đã cố gắng tìm một giải pháp đơn giản cho vấn đề khá đơn giản của mình.

Các công nghệ mà tôi hiện đang sử dụng bao gồm: Java, Jersey/JAX-RS, Eclipse với plugin Maven.

+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 Tôi đã xem qua bản pdf đó và nó cực kỳ cụ thể đối với máy chủ mẫu. Tôi đang sử dụng một máy chủ hoàn toàn khác với WebSphere đã được cài đặt (tôi không có quyền kiểm soát nó) và các cấu hình này không khớp với máy chủ mà tôi đang cố triển khai. –

Trả lời

9

Bạn sẽ có thể thiết lập servlet filter được thực thi trước trình xử lý REST của bạn, kiểm tra tiêu đề yêu cầu "Ủy quyền", base 64 decodes, trích xuất tên người dùng và mật khẩu và xác minh. Một cái gì đó như thế này:

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); 
} 

Tất cả các thùng chứa servlet đều có cách tiêu chuẩn để định cấu hình chuỗi bộ lọc.

+0

Điều đó hoạt động hoàn hảo! Cảm ơn bạn. –

4

Hoàn thành triển khai dựa trên câu trả lời maerics.

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() { 
    } 
} 
Các vấn đề liên quan