JDBCレルムの定義
レルムとは「ユーザーやグループの情報を格納したリポジトリのこと」と説明しましたが、それが何? というのが大方の反応でしょう。以前からレルムという仕組みは存在していましたが、まだ一般的な概念ではなく、JAAS(Java Authentication and Authorization Service)を使い認証を実現していました。サブジェクト、ログインモジュール、セキュリティポリシーファイルなどと格闘した経験があります。しかも宣言(定義)するだけでなく、コーディングもしなければならず、非常に悩まされた記憶があります。レルムという考えはユーザーやグループの情報をLDAPなりJDBCに格納することにより、アプリケーションサーバであるGlassFishがJAASを使って認証を行ってくれるものです。非常に楽な時代になったと感じています。
具体的にGlassFishの管理コンソールを使ってJDBCレルムの定義をします。管理コンソールの左ペインで[設定]-[セキュリティ]-[レルム]と開きます。デフォルトでは「file」、「admin-realm」、「certificate」しかないため、JDBCレルムを定義する必要があります。[レルム]をクリックすると図6のような画面が表示されます。
[新規]ボタンをクリックすると図7のような画面が現れ、ここに情報を入力することで定義が行えます。新しいレルムの名前は分かりやすければ何でも構いません。

クラス名はセレクトボックスから「com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm」を選択すると、図8のようにより具体的なプロパティを入力する画面が表示されます。
図9のように入力します。「JAASコンテキスト」は「jdbcRealm」でデフォルトで表示されているので、変更しないでください。「JNDI」は第4回の芋焼酎カタログ用のテーブルを作成する際に定義したもの「jdbc/imoshop」を指定します。それ以降の指定は、今回変更または追加したテーブルの内容を指定します。ダイジェストアルゴリズムだけは今回平文を格納するため、「none」と入力する必要があります。入力が終わったら画面右下にある[了解]ボタンをクリックします。
図10のような画面が表示され、「imoshop_realm」が追加されていることが分かります。
デプロイメント・ディスクリプタ(web.xml、sun-web.xml)の変更
web.xmlに直接記述してもよいのですが、NetBeansの機能を使って定義します。左ペインで[プロジェクト]-[ImoshochuWeb01]-[Webページ]-[WEB-INF]を開き、[web.xml]をダブルクリックすると図11のような画面が右ペインに表示されます。[一般メニュー]が開いていますが、[XML]をクリックします。
図12のようにwelcome-file-list要素の下に記述します。web-resource-name要素はその下のurl-patternで指定されるURL内のリソースに名前を付けるためのものです。名前は任意で分かりやすい名前を付けます。ここでは「CustomerPages」と付け、url-patternを「/*」としています。「/*」とはすべてのリソースを指します。ただし、他のロール、例えばadminというロールでurl-patternに「/admin/*」と指定すると、「/*」と指定していても、より詳しく指定したurl-patternが優先されます。従って仮にsuperadminというロールで「/admin/super/*」と指定すると、adminはこの中には入れません。

次に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などの名前にした方が好ましいと思います。対応付けが分かるようにあえて変えてみました。

次にform-login-config要素を定義します。実際にはその子要素としてform-login-page要素とform-error-page要素を定義します。両方とも/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は安全ではないと言われています)などで暗号化して保存しなければなりません。






