Java Web HTTP Basic 인증 실현

17842 단어 Java
Basic 인증 은 비교적 간단 한 HTTP 인증 방식 으로 클 라 이언 트 는 명문 (Base 64 인 코딩 형식) 을 통 해 사용자 이름과 비밀 번 호 를 서버 에 전송 하여 인증 하 는데 보통 HTTPS 와 결합 하여 정보 전송 의 안전 을 확보 해 야 한다.화면 은 아래 와 같다.
Java Web 实现 HTTP Basic 认证_第1张图片
다음은 Servlet 표준 Filter 를 기반 으로 HTTP Basic 로그 인 체 제 를 구현 하여 테스트 시의 임시 발표 용 으로 사용 할 수 있 습 니 다.일부 함 수 는 AJAXJS 라 이브 러 리 를 이용 했다.
package com.ajaxjs.web;

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 com.ajaxjs.util.Encode;
import com.ajaxjs.util.CommonUtil;
import com.ajaxjs.util.logger.LogHelper;

/**
 *     HTTP Basic   
 * 
 * @author sp42 [email protected]
 */
public class HttpBasicAuthFilter implements Filter {
	private static final LogHelper LOGGER = LogHelper.getLog(HttpBasicAuthFilter.class);

	/**
	 *    ,         admin
	 */
	private static final String userid = "admin";

	/**
	 *     
	 */
	private static String pwd = "123123";
	
	/**
	 *          ,     
	 */
	public static boolean isEnadble = false;

	@Override
	public void init(FilterConfig config) throws ServletException {
		LOGGER.info("   HTTP BasicAuth     ");

		if (config.getInitParameter("adminPassword") != null)
			pwd = config.getInitParameter("adminPassword");//    web.xml       
		
		isEnadble = true;
	}

	@Override
	@SuppressWarnings("deprecation")
	public void doFilter(ServletRequest _request, ServletResponse _response, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) _request;
		HttpServletResponse response = (HttpServletResponse) _response;

		if (!checkAuth(request)) {
			String msg = "\"Please input your account\""; //       ,      ,      

			response.setCharacterEncoding("utf-8");
			response.setStatus(401, "Authentication Required");//       401,      sendError, 
			response.setHeader("WWW-Authenticate", "Basic realm=" + msg);//           ,          
			response.setCharacterEncoding("utf-8");
			response.getWriter().append("Please login!      !");

			LOGGER.info("HTTP BasicAuth     !");
		} else {
			// request.setAttribute("userName", userid);
			chain.doFilter(request, response);
		}
	}

	@Override
	public void destroy() {
	}

	/**
	 *         
	 * 
	 * @param request     
	 * @return       
	 */
	private static boolean checkAuth(HttpServletRequest request) {
		return checkAuth(request.getHeader("Authorization"), userid, pwd);
	}

	/**
	 *         
	 * 
	 * @param arr
	 * @return         
	 */
	private static boolean isBadArray(String[] arr) {
		return arr == null || arr.length != 2;
	}

	/**
	 *         
	 * 
	 * @param authorization      HTTP        Authorization    
	 * @param username    
	 * @param password   
	 * @return true =     / false =     
	 */
	private static boolean checkAuth(String authorization, String username, String password) {
		if (CommonUtil.isEmptyString(authorization))
			return false;

		String[] basicArray = authorization.split("\\s+");
		if (isBadArray(basicArray))
			return false;

		String idpass = Encode.base64Decode(basicArray[1]);
		if (CommonUtil.isEmptyString(idpass))
			return false;

		String[] idpassArray = idpass.split(":");
		if (isBadArray(idpassArray))
			return false;

		return username.equalsIgnoreCase(idpassArray[0]) && password.equalsIgnoreCase(idpassArray[1]);
	}
}

HTTP Basic 은 보안 이 너무 약 하기 때문에 요약 인증 인 HTTP Digest 를 강화 하 는 것 을 고려 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기