Java 是否有一种与服务器无关的方法来实现基本身份验证?

Java 是否有一种与服务器无关的方法来实现基本身份验证?,java,jersey,websphere-6.1,basic-authentication,tomcat,Java,Jersey,Websphere 6.1,Basic Authentication,Tomcat,我正在尝试向RESTful web服务添加基本身份验证。目前,我拥有ApacheTomcat6.0服务器的基本身份验证,但我需要在WebSphereApplicationServer版本上部署我的web服务。6.1,我在WebSphere上运行基本身份验证时遇到问题 Java中是否有方法检查HTTP请求的身份验证头,以及如果提供的用户名/密码(Base64编码)与已知帐户不匹配,则强制用户输入新的用户名/密码 我曾尝试过实现Spring安全性,但由于我的项目完全没有Spring,因此要让它正常工

我正在尝试向RESTful web服务添加基本身份验证。目前,我拥有ApacheTomcat6.0服务器的基本身份验证,但我需要在WebSphereApplicationServer版本上部署我的web服务。6.1,我在WebSphere上运行基本身份验证时遇到问题

Java中是否有方法检查HTTP请求的身份验证头,以及如果提供的用户名/密码(Base64编码)与已知帐户不匹配,则强制用户输入新的用户名/密码

我曾尝试过实现Spring安全性,但由于我的项目完全没有Spring,因此要让它正常工作是一件非常痛苦的事情,我正试图找到一个简单的解决方案来解决我的问题


我目前使用的技术包括:Java、Jersey/JAX-RS、带Maven插件的Eclipse

您应该能够设置在REST处理程序之前执行的,检查“授权”请求头,提取用户名和密码,并验证。大概是这样的:

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

所有servlet容器都有配置过滤器链的标准方法。

基于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() {
    }
}

?@Marc我已经浏览了该pdf,它非常特定于示例服务器。我使用的是一个完全不同的服务器,已经安装了WebSphere(我无法控制它),这些配置与我试图部署到的服务器不匹配。