本格派エンジニアの工具箱

第22回 Apache Shiroを利用してWebアプリケーションに認証機構を組み込む

この記事を読むのに必要な時間:およそ 6 分

ログイン処理を行うプログラムの作成

続いてログインページやServletのプログラムを作っていきましょう。まず,ログインページとなる/login.jspでは,次のようにユーザ名とパスワードを入力できるようにします。

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Shiroサンプル - ログインページ</title>
  </head>
  <body>
    <h1>ログインページ</h1>
    
    <form action="Login" method="POST">
      ユーザ名: <input type="text" name="username"/> <br/>
      パスワード: <input type="password" name="password"/> <br/>
      <input type="submit" name="loginButton" value="ログイン"/>
    </form>
    
  </body>
</html>

ログインページからの入力を処理するServletはLogin.javaとして次のように作りました。

public class Login extends HttpServlet {
  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");

    String url = "/login.jsp";    // リダイレクト先のURL
    
    // ユーザ名とパスワードを取得
    String username = request.getParameter("username");
    String password = request.getParameter("password");

    // Tokenを作成
    UsernamePasswordToken token = 
        new UsernamePasswordToken(username, password);
    
    try {
      // Subjectを取得
      Subject subject = SecurityUtils.getSubject();
      // ログイン
      subject.login(token);
      token.clear();
      
      url = "/user/content.jsp";
    } catch (UnknownAccountException ex) {
      ex.printStackTrace();
    } catch (IncorrectCredentialsException ex) {
      ex.printStackTrace();
    } catch (Exception ex) {		
      ex.printStackTrace();
    }

    // リダイレクト
    RequestDispatcher dispatcher =
        getServletContext().getRequestDispatcher(url);
    dispatcher.forward(request, response);
  }
}

ここでは,受け取ったユーザ名とパスワードからTokenを作成し,それを使ってログイン処理を行っています。ログインに成功したら/user/content.jspにリダイレクトします。/user/conten.jspは次のようにしました。単にテキストとログアウトページへのリンクを表示するだけのファイルです。ポイントは,このファイルをauthcフィルタが適用される/user/ディレクトリ以下に配置することです。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Shiroサンプル - コンテンツ</title>
  </head>
  <body>
    <p>ここは保護されたページです。</p>
    
    <h1>コンテンツページ</h1>
    
    <p><a href="<c:url value='/Logout' />">ログアウト</a></p>
    
  </body>
</html>

ログアウトを行うプログラムはLogout.javaとして,Subjectを取得してlogout()メソッドを呼び出す処理を実行します。次のような感じです。

public class Logout extends HttpServlet {
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
          throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    
    String url = "/login.jsp";    // リダイレクト先のURL
    
    // Subjectを取得
    Subject subject = SecurityUtils.getSubject();
    
    if (subject != null) {
      // ログアウト
      subject.logout();
    }

    HttpSession session = request.getSession(false);
    if( session != null ) {
      // セッションの終了
      session.invalidate();
    }

    // リダイレクト
    RequestDispatcher dispatcher =
        getServletContext().getRequestDispatcher(url);
    dispatcher.forward(request, response);
  }

}

著者プロフィール

杉山貴章(すぎやまたかあき)

ONGS Inc.所属のプログラマ兼テクニカルライター。雑誌,書籍,Webメディアで多数の著作をもつ。

著書