<目次>
(1) JavaのServletでフォーム認証(Form認証)をカスタム実装する方法
(1-1) フォーム認証の概要
(1-2) フォーム認証をカスタムする際のポイント
(1-3) 構文
(1-4) サンプルプログラム
(1) JavaのServletでフォーム認証(Form認証)をカスタム実装する方法
今回はJSP/Servletのフォーム認証におけるログイン処理を独自でカスタム実装する方法をご紹介します。
(1-1) フォーム認証の概要
最もベーシックなフォーム認証では、「web.xml」で認証の範囲やロールなどを設定してフォーム認証を有効化し、ユーザ情報はTomcatの場合デフォルトでは「tomcat-users.xml」に設定し、「ログイン画面」と「ログインエラー画面」を用意する事で、最低限のログイン処理を手軽に実現する事ができます。
・web.xml | フォーム認証の設定(認証範囲やロールの設定など) |
・tomcat-users.xml | ログインユーザの設定(ID、パスワード、付与ロール)など |
・ログイン画面 | ログインをするための画面(jsp) |
・ログインエラー画面 | ログインに失敗した時に遷移する画面 |
(1-2) フォーム認証をカスタムする際のポイント
ポイントとなるのは上記のベーシックなフォーム認証では「ログイン画面」の<form>タグのaction属性にJavaEEで定義されている「j_security_check」というアクションを用いて認証を行っている点です。
この「j_security_check」はServletのAPIで、サーブレットコンテナ(Tomcatなど)に組み込まれています。Tomcatの場合は「org.apache.catalina.authenticator.FormAuthenticator」クラスに含まれています。
フォーム認証を独自にカスタムするために行うのはただ1つ、この「j_security_check」アクションを「独自のカスタム認証サーブレット」に置き換えるのみです。
(1-3) 構文
HttpServletRequestインターフェイスの認証用のメソッドを使ってログイン用サーブレットを実装していきます。具体的には以下のメソッドを使用します。
[HttpServletRequestのインスタンス].login(user, passwd);
(1-4) サンプルプログラム
▲1、▲2の部分はそれぞれご自身の「ログイン成功時に表示する画面」、「ログイン失敗時に表示する画面」にそれぞれ置き換えてください。
import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/CustomAuthentication") public class CustomAuthentication extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //# 遷移先画面のページ名を定義 String forward_success = "/auth/AfterLogin.jsp(▲1)"; String forward_error = "/LoginError2.jsp(▲2)"; String user = request.getParameter("j_username"); String passwd = request.getParameter("j_password"); try { //# 認証の実施 request.login(user, passwd); //# 画面遷移(ログイン成功) RequestDispatcher dispatch = request.getRequestDispatcher(forward_success); dispatch.forward(request, response); }catch(ServletException e) { e.printStackTrace(); //# 画面遷移(ログイン失敗) RequestDispatcher dispatch = request.getRequestDispatcher(forward_error); dispatch.forward(request, response); } } }
以下、実行結果のイメージです。
・ログイン
(図141)
↓
・ログイン成功
(図142)
(操作動画)