SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Java EE 6 開発入門

サーブレット3.0の新機能

Java EE 6 開発入門(2)

  • X ポスト
  • このエントリーをはてなブックマークに追加

認証処理の実装

 従来のサーブレットには4つの認証方式がありました。基本認証、ダイジェスト認証、フォーム認証(FORM認証)、クライアント認証の4つです。中でもフォーム認証は、認証画面をJSPでカスタマイズすることができましたので使われる機会が多く、しかしFORM認証画面では、以下のタグを使うことが必須となっていました。

<form action="j_security_check">

 これは、認証用のURLが固定され、またFORM認証の処理そのものをカスタマイズすることが難しいという問題がありました。従来のサーブレットでは、これらログイン機能に関する変更を行うことができず、Javaコンテナによっては拡張された実装を使う必要がありました。アプリケーションによっては、画面で入力することなく特定のユーザで代理認証を行う機能も必要とされますが、従来のサーブレットでは行うことができないため、独自拡張してJavaコンテナとは別の認証の仕組みを用意する手間がありました。サーブレット3.0ではこの<form action="j_security_check">の代替機能となる認証方式をサーブレットで実装できるようにしていおり、それぞれサーブレットのメソッド内で呼び出すことができます。この機能が提供されることにより、大掛かりな独自拡張することなく認証をカスタマイズすることができます。

 認証情報の参照先については、従来通りJavaコンテナで設定されたものを使用します。管理方法は、アプリケーション内のxmlでユーザ情報を持つもの、データベースを利用して保存する方式、LDAPと呼ばれるディレクトリサービスでユーザ情報を階層的に格納しているサーバに問い合わせをする方法などが提供されています。

 認証情報の参照設定についてはJavaコンテナでの設定となりますので、例えばTomcatで設定する場合には、以下のサイトを参考にして構築しましょう。

 では話をサーブレット3.0での実装に移します。

(1)ログイン:HttpServletRequest.login("ユーザ名" , "パスワード")

 引数に指定したユーザ名、パスワードを使って認証を行います。

 もし認証に失敗した場合には例外(ServletException)がスローされますので、もしエラーページやエラーメッセージを独自で出したい場合には例外をキャッチする必要があります。

 認証に成功した場合、このメソッドは特に何も返しませんので、認証しているかどうかは、HttpServletRequestのgetRemoteUser()が、getUserPrincipal()メソッドで情報が取得できるかどうかを確認することで判断します。

リスト6 ログイン処理サーブレット LoginServlet.java
// サーブレット定義アノテーション
@WebServlet(name="LoginServlet", urlPatterns={"/LoginServlet"})
public class AuthServlet extends HttpServlet {
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        
        // リクエストされたユーザ名を取得
        String username = request.getParameter("username");
        // リクエストされたパスワードを取得
        String password = request.getParameter("password");
        
        // 認証を行う。もし認証が失敗していればServletExceptionがスローされる
        request.login(username, password);
        
        // 認証済の場合、remoteUserにユーザ名が入る
        String remoteUser = request.getRemoteUser();
        
        …(中略)…
    }
}

 このログインサーブレットの定義は、@WebServletで定義します。nameでサーブレットの名称を定義、urlPatternsでリクエストするURLを定義します。この例では /LoginServlet になっています。

(2)ログアウト:HttpServletRequest.logout()

 ログアウト処理をJavaコンテナに対して行います。従来はセッションの破棄などを明示的に行いましたが、ログアウト処理を独立させて行うことによって、サーバ内で消去したくない情報まで消されてしまうことがなくなります。コードはログイン同様非常に簡潔です。

リスト7 ログアウト処理サーブレット LogoutServlet.java
// サーブレット定義アノテーション
@WebServlet(name="LogoutServlet", urlPatterns={"/LogoutServlet"})
public class LogoutServlet extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        
        // ログアウト処理
        request.logout();
        …(中略)…
    }
}

(3)コンテナ認証:HttpServletRequest.authenticate(HttpServletResponse)

 認証結果をbooleanで受け取ります。この認証処理は、従来のBASIC認証やFORM認証を使って認証する場合に用います。ブラウザから入力されたログイン情報を使って、任意の位置でログイン処理を実行させることになります。これによって、認証前や認証後に処理を追加しやすくなりました。

リスト8 コンテナ認証ログイン処理サーブレット AuthServlet.java
@WebServlet(name="AuthServlet", urlPatterns={"/AuthServlet"})
public class AuthServlet extends HttpServlet {
   
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        
        // 認証前の処理
        …(省略)…
        
        // コンテナ認証を行う。結果をbooleanで取得。
        boolean isAuth = request.authenticate(response);
        
        // 認証後の処理
        …(省略)…
    }
}

 なお、これら認証設定の内容は、web.xmlでは<security-constraints>、アノテーションであれば@ServletSecurityで一括設定することもできます。

JARファイルからの静的コンテンツ読み込み

 WEB-INF/lib/resource.jarなど、従来どおりのjarファイルと同じように配置したファイルの中から、HTMLやJSPを参照できるようになりました。以下のルールを守ることで利用可能です。

  • jarファイル内にあるMETA-INF/resources/ 以下に静的ファイルやJSPを配置する

 この機能の恩恵は大きいもので、jarにパッケージしたライブラリの中には、JSPの描画をサポートするテンプレートエンジンと呼ばれるものが存在し、現在はよく使われています。これらテンプレートエンジンの中身にはHTMLやCSSなど、本来Javaのクラスで構成されるjarファイルには含まれないものが必要とされますが、JavaコンテナはWEB-INF/libにjarを配置する規則がありましたので、これらの静的ファイルがあったとしても認識しませんでした。

次のページ
まとめ

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Java EE 6 開発入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 東 浩二(アズマ コウジ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5920 2011/06/01 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング