Servletで行うBasic認証について教えてください。
とあるHPにて下記サンプルソースを入手しました。
これをコンパイルしてTomcat(3.2.1)にて実行した
ところ、「req.getHeader(Authorization);」が
Nullで返ってきていて、ユーザとパスワードを聞いてくる
ダイアログが表示されません。
出てくるのはNullだった場合の「You must enter password.」です。
環境は
Apache 1.3.27
Tomcat 3.2.1
です。
なんらかの設定が足りないためにダイアログが出てこない
ものと思われます。ご教授お願いします。m(__)m
ちなみに、Apache側で設定するBasic認証は出来ます。
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Authentication extends HttpServlet {
public void init(ServletConfig conf) throws ServletException {
super.init(conf);
}
public void destroy() {
super.destroy();
}
public String getServletInfo() {
return Authentication;
}
public void service(HttpServletRequest req,HttpServletResponse res)
throws ServletException,IOException {
super.service(req,res);
}
public void doGet(HttpServletRequest req,HttpServletResponse res)
throws ServletException,IOException {
res.setContentType(text/html);
PrintWriter out = res.getWriter();
String auth = req.getHeader(Authorization);
out.println(<HTML><HEAD><TITLE>);
out.println(Authorization);
out.println(</TITLE></HEAD><BODY><H1>);
out.println(Authorization);
out.println(</H1>);
if( auth == null ) {
res.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
out.println(<P>You must enter password.</P>);
}
else {
String realm = auth.substring(auth.lastIndexOf(' ')
+1);
byte b[] = realm.getBytes();
int l = b.length;
ByteArrayOutputStream bout = Base64.decode(new
ByteArrayInputStream(b),l);
if( bout != null ) {
String dec = bout.toString();
String name = dec.substring(0,dec.indexOf
(':'));
String password = dec.substring(dec.indexOf
(':')+1);
out.println(<P>OK. You are
authorized.</P>);
out.println(<P>Name = +name+,Password
= +password+.</P>);
}
else {
res.setStatus
(HttpServletResponse.SC_UNAUTHORIZED);
out.println(<P>Failed to parse
authorization header.</P>);
}
}
out.println(</BODY></HTML>);
out.close();
}
public void doPost(HttpServletRequest req,HttpServletResponse res)
throws ServletException,IOException {
super.doPost(req,res);
}
public long getLastModified(HttpServletRequest req) {
return super.getLastModified(req);
}
}
ベーシック認証ですが、これはApachの機能です。
1.ベーシック認証が掛からない場合
この場合は、Apachの設定ファイルを見直して見る
必要があります。
http.confの中に認証設定として
<Location /servlet/*>
Options None
AllowOverride AuthConfig
AuthUserFile /etc/httpd/conf/.htpasswd
AuthName test05Auth
AuthType Basic
require valid-user
</Location>
を加える必要があります。
http://www.remus.dti.ne.jp/~hori-/java/apach-conf.htm
2.ベーシック認証は掛かるけど意図的にServletからダイアログを出す。
APIにダイアログを出すメソッドがあったけど
手元に資料が無いからまた今度