BLOGTIMES
2012/11/21

Servlet コンテナの機能を使わずに Filter のみで Basic 認証する

  java 
このエントリーをはてなブックマークに追加

Servlet コンテナの機能を使えば高機能なユーザー認証ができることは知っているのですが、今回はとにかく簡単に Basic 認証をする方法が欲しかったので、javax.servlet.Filter で Basic 認証をする方法について調べてみました。基本的な部分は「Java版でBasic認証をかけてみる - SEとPGの狭間」で紹介されている方法をそのまま使わせてもらって、Servlet 3.0 環境にそのまま突っ込めば動くように仕上げてあります。

BasicAuthenticationFilter.java

import java.io.IOException; import java.util.HashMap; import java.util.Map; 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 javax.servlet.annotation.WebFilter; import javax.servlet.annotation.WebInitParam; import com.sun.jersey.core.util.Base64; @WebFilter( filterName = "BasicAuthenticationFilter", urlPatterns = { "/*" }, initParams = { @WebInitParam(name = "realm", value = "SecretArea"), @WebInitParam(name = "user", value = "foo"), @WebInitParam(name = "pass", value = "bar"), } ) public class BasicAuthenticationFilter implements Filter { Map<String,String> userMap = new HashMap<String,String>(); String realm = ""; @Override public void init(FilterConfig conf) throws ServletException { realm = conf.getInitParameter("realm"); String user = conf.getInitParameter("user"); String pass = conf.getInitParameter("pass"); userMap.put(user, pass); } @Override public void destroy() { } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpReq = (HttpServletRequest) req; String authHeader = httpReq.getHeader("Authorization"); if (isAuth(authHeader)) { chain.doFilter(req, res); } else { HttpServletResponse httpRes = (HttpServletResponse) res; httpRes.setHeader("WWW-Authenticate", "BASIC realm="+realm); httpRes.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Authorization Required"); } } private boolean isAuth(String authHeader) { if (authHeader == null || authHeader.length() <= 6) { return false; } String useridAndPass; useridAndPass = new String(Base64.decode(authHeader.substring(6).getBytes())); String[] userPassArray = useridAndPass.split(":"); if (userPassArray.length == 2 && userMap.containsKey(userPassArray[0]) && userMap.get(userPassArray[0]).equals(userPassArray[1])) { return true; } return false; } }

    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/5389
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン