- blogs:
- cles::blog
2012/11/21

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

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 を使ってログインすることができます。
サイト内検索
検索ワードランキング
へぇが多いエントリ
閲覧数が多いエントリ
1 . アーロンチェアのポスチャーフィットを修理(112062)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110695)
3 . 年次の人間ドックへ(110314)
4 . 2023 年分の確定申告完了!(1つめ)(109861)
5 . 三菱鉛筆がラミーを買収(109766)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110695)
3 . 年次の人間ドックへ(110314)
4 . 2023 年分の確定申告完了!(1つめ)(109861)
5 . 三菱鉛筆がラミーを買収(109766)
cles::blogについて
Referrers