SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

GlassFishからアプローチするJava

GlassFishからアプローチするJava~入門編~
第7回「Webアプリケーションの作成 JDBCレルムで認証実現」

複数のユーザが同時に買い物ができるように実装する

ダウンロード サンプルコード (17.6 KB)

JDBCレルムの定義

 レルムとは「ユーザーやグループの情報を格納したリポジトリのこと」と説明しましたが、それが何? というのが大方の反応でしょう。以前からレルムという仕組みは存在していましたが、まだ一般的な概念ではなく、JAAS(Java Authentication and Authorization Service)を使い認証を実現していました。サブジェクト、ログインモジュール、セキュリティポリシーファイルなどと格闘した経験があります。しかも宣言(定義)するだけでなく、コーディングもしなければならず、非常に悩まされた記憶があります。レルムという考えはユーザーやグループの情報をLDAPなりJDBCに格納することにより、アプリケーションサーバであるGlassFishがJAASを使って認証を行ってくれるものです。非常に楽な時代になったと感じています。

 具体的にGlassFishの管理コンソールを使ってJDBCレルムの定義をします。管理コンソールの左ペインで[設定]-[セキュリティ]-[レルム]と開きます。デフォルトでは「file」、「admin-realm」、「certificate」しかないため、JDBCレルムを定義する必要があります。[レルム]をクリックすると図6のような画面が表示されます。

図6.レルム追加画面
図6.レルム追加画面

 [新規]ボタンをクリックすると図7のような画面が現れ、ここに情報を入力することで定義が行えます。新しいレルムの名前は分かりやすければ何でも構いません。

図7.新規レルム名前、クラス名指定画面
図7.新規レルム名前、クラス名指定画面

 クラス名はセレクトボックスから「com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm」を選択すると、図8のようにより具体的なプロパティを入力する画面が表示されます。

図8.プロパティー入力画面
図8.プロパティー入力画面

 図9のように入力します。「JAASコンテキスト」は「jdbcRealm」でデフォルトで表示されているので、変更しないでください。「JNDI」は第4回の芋焼酎カタログ用のテーブルを作成する際に定義したもの「jdbc/imoshop」を指定します。それ以降の指定は、今回変更または追加したテーブルの内容を指定します。ダイジェストアルゴリズムだけは今回平文を格納するため、「none」と入力する必要があります。入力が終わったら画面右下にある[了解]ボタンをクリックします。

図9.プロパティー入力後画面
図9.プロパティー入力後画面

 図10のような画面が表示され、「imoshop_realm」が追加されていることが分かります。

図10.JDBCレルム追加確認画面
図10.JDBCレルム追加確認画面

デプロイメント・ディスクリプタ(web.xml、sun-web.xml)の変更

 web.xmlに直接記述してもよいのですが、NetBeansの機能を使って定義します。左ペインで[プロジェクト]-[ImoshochuWeb01]-[Webページ]-[WEB-INF]を開き、[web.xml]をダブルクリックすると図11のような画面が右ペインに表示されます。[一般メニュー]が開いていますが、[XML]をクリックします。

図11.web.xmlを開いた直後の画面
図11.web.xmlを開いた直後の画面

 図12のようにwelcome-file-list要素の下に記述します。web-resource-name要素はその下のurl-patternで指定されるURL内のリソースに名前を付けるためのものです。名前は任意で分かりやすい名前を付けます。ここでは「CustomerPages」と付け、url-patternを「/*」としています。「/*」とはすべてのリソースを指します。ただし、他のロール、例えばadminというロールでurl-patternに「/admin/*」と指定すると、「/*」と指定していても、より詳しく指定したurl-patternが優先されます。従って仮にsuperadminというロールで「/admin/super/*」と指定すると、adminはこの中には入れません。

図12.web.xmlの認証関連の定義
図12.web.xmlの認証関連の定義

 次にauth-constraint要素の下のrole-name要素でロール名を指定します。ここでは「customer」と指定しました。ここで皆さんもお気づきになったかと思いますが、これではグループと紐づけることができません。図13のようにsun-web.xmlの中のsecurity-role-mapping要素でロール名とグループ名を紐づけます。グループ名のユーザーとは図5のgroup_idを指します。もとのweb.xmlに戻り、login-config要素の中を説明します。auth-methodはDIGEST、CLIENT-CERT、BASIC、FORMが指定できます。今回はFORMを指定しました。その下のrealm-nameは図7で付けたレルム名を指定します。imoshop_realmと付けたのでここではimoshop_realmと指定します。本来はレルムが分かるようにjdbcなどの名前にした方が好ましいと思います。対応付けが分かるようにあえて変えてみました。

図13.sun-web.xmlの認証関連の定義
図13.sun-web.xmlの認証関連の定義

 次にform-login-config要素を定義します。実際にはその子要素としてform-login-page要素とform-error-page要素を定義します。両方とも/login.jspを指定しています。実際にはエラーページも定義すべきですが、今回は間違えたら何も反応しないだけです。図14がlogin.jspです。

図14.login.jsp
図14.login.jsp
※注意

 実際のネットショップではHTTPS(HTTP over SSL)でクライアントとサーバ間の通信路自体を暗号化すべきです。SSLについてはネットで簡単に調べることができるため割愛しましたが、web.xmlではauth-constraintの下にuser-data-constraint要素を定義します。その子要素としてtransport-guarantee要素を定義し、「CONFIDENTIAL」と指定する必要があります。要は通信を暗号化しますという意味です。また、今回はusersテーブルのpasswordも平文で保存していますが、RSA-2048(執筆時点2010年2月時点では既にRSA-1024は安全ではないと言われています)などで暗号化して保存しなければなりません。

次のページ
当記事の注意点

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

GlassFishからアプローチするJava連載記事一覧

もっと読む

この記事の著者

川久保 智晴(カワクボ トモハル)

haruプログラミング教室(https://haru-idea.jp/)主宰。COBOL、FORTRANで13年、Javaを中心としたWeb開発で11年。3つしか言語知らないのかというとそうでもなく、sed/awk、Perl、Python, PHP,  C#, JavaScriptなども一時期は業...

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4931 2010/03/17 14:00

イベント

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

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

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

メールバックナンバー