SAStruts(Super Agile Struts)あれこれ
2-3 会員かどうか判断しよう
目次
- 2-3-0 事前準備
- 2-3-1 概要
- 2-3-2 サンプルの説明
- 2-3-3 サンプルのポイント
- 2-3-4 サンプルの使い方
- 2-3-5 ファイル構成
- 2-3-6 サンプルの画面遷移と画面情報の入出力
- 2-3-7 設定ファイル(1)
- 2-3-8 設定ファイル(2)
- 2-3-9 認証検証用のアクションメソッドを追加
- 2-3-10 認証成功画面
内容
2-3-0 事前準備
「2-2 会員登録をしよう」をベースにします。2-3-1 概要
会員制のWebサイトの場合は、会員である人のアクセスかそうでないかを識別するために認証を行う必要があります。 この節では、前の節で登録した会員情報を利用して、会員の認証を行います。認証は個々に作りこむことも多いですが、ここでは、Webアプリケーションの仕様で決められている汎用的な方法で認証を行います。SAStrutsアプリケーションもWebアプリケーションの1つなので、同じ方法を使用できます。前の節のサンプルに対して、認証機能を追加します。MemberActionアクションのonlyメソッドには、Basic認証を行ってuserというロールを持つユーザーだけがアクセスできるように設定します。
元ネタではJSPファイルに対してアクセス制限をかけるようにしていますが、SAStrutsでは基本的にブラウザからJSPを直接リクエストすることはないので、アクションメソッドに対するアクセス制限を行うようにしています。
401(認証エラー)画面

↓
認証成功画面(only.jsp)
Basic認証とは、次のようなダイアログが表示され、ユーザ名とパスワードの入力を促し、その情報で認証する方法です。

このユーザー名とパスワードで認証された場合は、このユーザーにロールが割り当てられます。
アクセスされたアクションメソッドに対する権限をそのロールが持っている場合は、アクセスできます。本サンプルのユーザー名は、「2-2 会員登録をしよう」で登録した会員のメールアドレスです。メールアドレスとパスワードをBasic認証のダイアログに入力することで、保護されたアクションメソッドにアクセスできます。
2-3-2 サンプルの説明
MemberActionクラスのonlyメソッドが保護されているアクションメソッドです。ブラウザからonlyメソッドにアクセスすると、TomcatがBasic認証を要求します。認証に成功し、そのユーザーがuserというロールを持っていると、only.jspが表示されます。それ以外の場合は401ステータスコードをブラウザに戻します。2-3-3 サンプルのポイント
・会員の認証をどのように行わせるか。 ・保護したアクションメソッドに対してどのユーザーがアクセスできるかという権限を設定する方法 ・認証されたユーザーがどのような権限を持っているかを取得するためのサーブレットAPI ・認証の設定はアプリケーションサーバーに依存します。 ・権限の設定はアプリケーションサーバーに依存しません。■認証と権限
| 認証情報入力方式 | web.xmlの<login-config> |
| 認証リポジトリ | server.xmlの<realm> |
| 認証情報 | Tomcatが管理していて、サーブレットAPIで取得できる |
| 権限管理 | web.xmlの<security-constraint> |
2-3-4 サンプルの動かし方
サンプルはあらかじめ用意していないので、以降の項目を参照にして、自分で作成しなければいけません。2-3-5 ファイル構成
今回、作成、自動生成、もしくは変更するファイルを以下に示します。| ファイル名 | 種別 | 作成/自動生成/変更 |
| server.xml | Tomcat設定ファイル | 変更 |
| web.xml | Webアプリ設定ファイル | 変更 |
| MemberForm.java | ActionFormクラス | 変更 |
| only.jsp | JSP | 作成 |
2-3-6 サンプルの画面遷移と画面情報の入出力
2-3-7 設定ファイル(1)
1.web.xml
<web-app>の子要素として以下の設定を追加します。
<security-constraint>
<web-resource-collection>
<web-resource-name>Members Only</web-resource-name>
<url-pattern>/member/only</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>user</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Members Only</realm-name>
</login-config>
<security-role>
<role-name>user</role-name>
</security-role>
1)<security-constraint>タグ
保護するリソースの設定は、<web-resource-collection>タグで行います。子要素である<web-resource-name>タグは、リソースに対する名前を定義します。このリソースがどこにあるものを指しているかは、<url-pattern>タグを用いてURLパターンによって指定します。また、このリソースにアクセスできるロールは<auth-constraint>タグの子要素である<role-name>タグで指定します。ここでは、MemberActionのonlyメソッドに対してuserというロールを持つユーザーのみがアクセスできるように設定しています。
2)<login-config>タグ
<login-config>タグによって認証情報の入力方式を設定します。方式は以下の4種類があります。
| 認証方式 | 設定内容 | 説明 |
| Basic認証(HTTP基本認証) | BASIC | ダイアログに入力されたID、パスワードで認証を行う |
| Digest認証 | DIGEST | ID、パスワードをMD5でダイジェスト化して送信し、その情報を利用して認証を行う |
| Form認証 | FORM | フォーム情報としてID、パスワードを送信し、その情報を利用して認証を行う |
| クライアント証明書認証 | CLIENT-CERT | クライアント証明書によって認証を行う |
3)<security-role>タグ
Tomcatに設定しているユーザーは複数のアプリケーションで利用されているので、このWebアプリケーションで利用するロールをここで指定しています。1)で指定した<role-name>タグのロールは、ここで指定したものでなければなりません。2)において認証を行い、成功すると付与されるロールです。
2-3-8 設定ファイル(2)
server.xmlはTomcatの設定ファイルで、Tomcatのインストールフォルダ下のconfフォルダに格納されています(ここでは、C:\xampp\tomcat\conf)。この中のRealmに関する設定が認証にかかわる部分で、認証リポジトリの設定が行われます。今回は、データベース(JDBC)をリポジトリとします。■JDBCRealmの設定
以下のように設定することで、前節で作成した会員テーブルと役割テーブルを利用できます。先ず、Tomcatのインストール時のserver.xmlを見てみましょう。Realmの設定が以下のようにされています(Tomcat6の場合)。
<!-- This Realm uses the UserDatabase configured in the global JNDI
resources under the key "UserDatabase". Any edits
that are performed against this UserDatabase are immediately
available for use by the Realm. -->
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
↑の設定は使用しませんのでコメントアウトして、以下の設定を追加しましょう。
<Realm className="org.apache.catalina.realm.JDBCRealm" debug="99"
driverName="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/sastruts"
connectionName="sastruts" connectionPassword="sastruts" digest="MD5"
userTable="Member" userNameCol="mail" userCredCol="password"
userRoleTable="roles" roleNameCol="role" />
■属性
| driverName | JDBCドライバ名 |
| connectionURL | コネクションURL |
| connectionName | MySQLにアクセスするためのユーザID |
| connectionPassword | MySQLにアクセスするためのパスワード |
| digest | 前節の会員テーブルでは、パスワードをMD5のダイジェストとして格納しています。デフォルトでは平文として認証するので、格納されているものがMD5のダイジェストであることをTomcatに知らせる設定を行います。 |
| userTable | ユーザ情報を格納するテーブル名 |
| userNameCol | ユーザIDに対応する列名 |
| userCredCol | パスワードに対応する列名 |
| userRoleTable | ロール情報を格納するテーブル名 |
| roleNameCol | ロールに対応する列名 |
■TomcatへのJDBCドライバのインストール
いままでは、Connect/J(MySQLのJDBCドライバ)はWebアプリケーションに内包されていました(WEB-INF/libフォルダに格納することでWebアプリケーションから利用できていました)。今回のサンプルではTomcatが直接アクセスできる必要があるので、Tomcatのライブラリフォルダ(ここでは、C:\xampp\tomcat\lib)にJDBCドライバをコピーしておく必要があります。
2-3-9 認証検証用のアクションメソッドを追加
"supersample2-2\src\main\java\sample\action\MemberAction.java"に以下のメソッドを追加しましょう。
@Execute(validator = false, roles = "user")
public String only() {
return "only.jsp";
}
2-3-10 認証成功画面
認証成功画面のJSPを作成します。"supersample2-2\src\main\webapp\WEB-INF\view\member\only.jsp"ファイルを以下の内容で作成します。
<%@page contentType="text/html; charset=UTF-8" %>
<HTML>
<BODY>
<H4>getRemoteUser()で取り出す</H4><BR>
あなた(<%= request.getRemoteUser() %>)はメンバーです。<BR>
<H4>getPrincipal()で取り出す</H4><BR>
あなた(<%= request.getUserPrincipal().getName() %>)はメンバーです。<BR>
<H4>isUserInRole()で取り出す</H4><BR>
あなたのロールとしてuserは<%= request.isUserInRole("user") %>(trueなら持っている)<BR>
あなたのロールとしてvipは<%= request.isUserInRole("vip") %>(trueなら持っている)<BR>
</BODY>
</HTML>
アップロードしたファイル
- tomcat_eclipse.jpg
- tomcat_eclipse2.jpg
- after_import.jpg
- start_tomcat.jpg
- import_1.jpg
- create_db_user.jpg
- create_table.jpg
- employee_mod1.jpg
- er1.jpg
- joincolumnser.jpg
- employee_add1.jpg
- employee_add2.jpg
- employee_add3.jpg
- employee_add4.jpg
- employee_del1.jpg
- employee_del2.jpg
- employee_del3.jpg
- employee_token1.jpg
- employee_token2.jpg
- employee_token3.jpg
- employee_page1.jpg
- index_page.jpg
- minus_action_1.jpg
- minus_action_2.jpg
- employee_hsqldb1.jpg
- emp_blk_add1.jpg
- emp_blk_add2.jpg
- emp_blk_add3.jpg
- emp_blk_add4.jpg
- emp_blk_add5.jpg
- hello_project1.jpg
- hello_project2.jpg
- hello_project3.jpg
- hello_project4.jpg
- hello_project5.jpg
- tiles1_1.jpg
- tiles1_2.jpg
- tiles1_3.jpg
- tiles1_4.jpg
- tutorial_db_er.jpg
- mysql_entity1.jpg
- mysql_entity2.jpg
- mysql_entity3.jpg
- mysql_entity4.jpg
- mysql_entity5.jpg
- mysql_entity6.jpg
- mysql_entity7.jpg
- mysql_entity8.jpg
- mysql_entity9.jpg
- mysql_entity10.jpg
- download_file1.jpg
- up.gif
- ajax_pattern1_1.jpg
- ajax_pattern1_2.jpg
- ajax_pattern2_2.jpg
- ajax_pattern2_1.jpg
- emp_blk_upd1.jpg
- emp_blk_upd2.jpg
- emp_blk_upd3.jpg
- emp_blk_upd4.jpg
- emp_blk_upd5.jpg
- ajax_json_1.jpg
- ajax_json_2.jpg
- ajax_json_3.jpg
- ajax_json_4.jpg
- ajax_json_5.jpg
- gen_eclipse1_1.jpg
- gen_eclipse1_2.jpg
- gen_eclipse1_3.jpg
- gen_eclipse1_4.jpg
- gen_eclipse1_5.jpg
- blk_add_vali_1.jpg
- blk_add_vali_2.jpg
- blk_add_vali_3.jpg
- blk_add_vali_4.jpg
- super1_1__1.jpg
- super1_1__2.jpg
- super1_1__0.jpg
- super1_1__3.jpg
- gen_fileheader1.jpg
- super1_1__4.jpg
- supersample2-1_1.jpg
- supersample2-1_2.jpg
- supersample2-1_3.jpg
- supersample2-1_4.jpg
- previewimage.jpg
- previewimage2.jpg
- supersample2-1_5.jpg
- supersample2-2_1.jpg
- supersample2-2_4.jpg
- supersample2-2_2.jpg
- supersample2-2_3.jpg
- supersample2-2_5.jpg
- supersample2-4_1.jpg
- supersample2-4_2.jpg
- supersample2-4_3.jpg
- supersample2-4_4.jpg
- supersample2-4_5.jpg
- supersample2-5_1.jpg
- supersample2-5_2.jpg
- supersample2-5_3.jpg
- supersample2-5_4.jpg
- supersample2-5_5.jpg
- supersample2-5_6.jpg
- supersample2-6_1.jpg
- supersample2-6_2.jpg
- supersample2-6_4.jpg
- supersample2-6_5.jpg
- supersample2-6_3.jpg
- supersample2-7_1.jpg
- supersample2-7_2.jpg
- blk_upd_reset_1.jpg
- blk_upd_reset_2.jpg
- blk_upd_reset_3.jpg
- blk_upd_reset_4.jpg
- blk_upd_reset_5.jpg
- supersample1-6_1.jpg
- supersample1-6_2.jpg
- supersample1-6_3.jpg
- supersample1-6_4.jpg
- supersample1-6_5.jpg
- supersample1-6_6.jpg
- supersample1-7_1.jpg
- supersample1-7_2.jpg
- supersample1-7_3.jpg
- supersample1-7_4.jpg
- supersample1-7_5.jpg
- supersample1-7_6.jpg
- supersample1-4_1.jpg
- supersample1-4_2.jpg
- supersample1-4_3.jpg
- supersample1-4_4.jpg
- supersample1-4_6.jpg
- supersample1-4_7.jpg
- supersample1-4_5.jpg
- pre_db_sample1.jpg
- pre_db_sample2.jpg
- pre_db_sample3.jpg
- pre_db_sample4.jpg
- pre_db_sample5.jpg
- supersample1-8_1.jpg
- supersample1-8_2.jpg
- supersample1-8_3.jpg
- supersample1-8_4.jpg
- supersample1-8_6.jpg
- supersample1-8_5.jpg
- more_s2jdbc_1.jpg
- more_s2jdbc_2.jpg
- more_s2jdbc_3.jpg
- more_s2jdbc_4.jpg
- t_safe_search1_1.jpg
- t_safe_search1_2.jpg
- t_safe_search2_1.jpg
- t_safe_search2_2.jpg
- project_websrv_1.jpg
- project_websrv_3.jpg
- ws_1address_1.jpg
- flexbuilder_1.jpg
- flexbuilder_2.jpg
- flexbuilder_3.jpg
- flexbuilder_4.jpg
- flexbuilder_5.jpg
- flexbuilder_6.jpg
- flexbuilder_7.jpg
- flexbuilder_8.jpg
- flexbuilder_9.jpg
- flexbuilder_10.jpg
- flexbuilder_11.jpg
- flexbuilder_12.jpg
- flexbuilder_13.jpg
- project_flex_1.jpg
- project_flex_2.jpg
- project_flex_3.jpg
- project_flex_4.jpg
- project_flex_5.jpg
- project_flex_8.jpg
- project_flex_7.jpg
- project_flex_6.jpg
- flex_emp_list_1.jpg
- flex_emp_list_2.jpg
- flex_emp_lst_e_1.jpg
- flex_emp_add_1.jpg
- flex_emp_add_2.jpg
- flex_emp_add_3.jpg
- flex_emp_add2_1.jpg
- flex_emp_add2_2.jpg
- flex_emp_add2_3.jpg
- flex_upload_1.jpg
- flex_upload_2.jpg
- tcpmon_1.jpg
- tcpmon_2.jpg
- tcpmon_3.jpg
- tcpmon_4.jpg
- flex_upload2_1.jpg
- flex_upload2_2.jpg
- flex_upload2_3.jpg
- flex_emp_del_1.jpg
- flex_emp_del_2.jpg
- flex_emp_del_3.jpg
- flex_emp_spr_1.jpg
- flex_emp_spr_2.jpg
- flex_emp_spr_3.jpg
- flex_grid_chk1_1.jpg
- flex_grid_chk1_2.jpg
- flex_grid_chk1_3.jpg
- flex_bulk_del_1.jpg
- flex_bulk_del_2.jpg
- flex_bulk_del_3.jpg
- flex_dd_grid1_1.jpg
- flex_dd_grid1_2.jpg
- flex_dd_grid1_3.jpg
- blazeds_setup_1.jpg
- s2blaze_proj_1.jpg
- s2blaze_proj_2.jpg
- s2blaze_proj_3.jpg
- s2blaze_proj_4.jpg
- s2blaze_proj_5.jpg
- s2blaze_proj_6.jpg
- s2blaze_proj_7.jpg
- s2blaze_proj_8.jpg
- s2blaze_proj_9.jpg
- blaze_emplist1_1.jpg
- blaze_emplist2_1.jpg
- blaze_emplist2_2.jpg
- blaze_emp_add_1.jpg
- blaze_emp_add_2.jpg
- blaze_emp_add_3.jpg
- blaze_fms1_1.jpg
- blaze_fms1_2.jpg
- blaze_fms2_1.jpg
- project_batch_1.jpg
- supersample2-3_1.jpg
- supersample2-3_2.jpg
- supersample2-3_3.jpg
- supersample2-8_1.jpg
- supersample2-8_2.jpg
















