レルムとは

レルムとは、WebアプリケーションがユーザIDとパスワードで認識するユーザのコレクションです。

レルムで出来る事

サーブレットコンテナが用意する認証機能を使用できる

web.xmlやcontext.xmlに設定を記述するだけで、Webブラウザのダイアログを使用するBasic認証や独自のログイン画面を使用するForm認証などを使用する事が出来ます。

データベースを選択できる

認証のためのデータベースにはJDBC接続, データソース, JNDIなどを選択できます。

認証されたユーザに対して複数の権限を付与できる

認証されたユーザに対して、Webアプリケーションが定義するユーザ追加機能, マスタ管理機能などの権限を個別に複数設定できます。

データベースにパスワードをそのまま保存しなくて済む

設定によって、データベースにはパスワードのMD5, SHA1などのダイジェスト値を使うようにする事が出来ます。 ユーザのパスワードがどのような文字列であるかを、データベース管理者にもわかりにくくする事が出来ます。

ユーザIDを取得できる

request.getRemoteUser()でユーザIDを取得できます。

権限チェックが出来る

request.isUserInRole(String)でログイン中のユーザがある権限を持っているかチェックする事が出来ます。

直接アクセスにたいしても認証を要求できる

トップページ以外のURLに対して直接アクセスされても、認証を要求した上で処理を継続できます。

直接アクセス時の処理の流れ

  1. URLが認証が必要なエリアであれば、リクエストを保存した上でログインページへ遷移する。
  2. ログインに失敗した場合、エラーページへ遷移する。
  3. ログインに成功した場合、保存したリクエストに対する処理を継続する。

レルムの使い方

以下、Apache Tomcat 5.5でレルムを使用する場合の手順を紹介します。

準備

ユーザID, パスワードが格納されているデータベースへアクセスするためにJDBC接続, データソースを使用する場合は、 ${Tomcatのインストールフォルダ}/commons/libにJDBCドライバをコピーする。

context.xmlの設定

Tomcat5ではTomcat4以前のようにContext要素をserver.xmlファイルに直接記述する事は推奨されていません。 Webアプリケーション固有の設定は、META-INF/context.xml内に記述して配備する事が出来ます。

<Context docBase="lepidolite" path="/lepidolite" reloadable="true">
	<Resource name="jdbc/lepidolitedb" auth="Container"
		type="javax.sql.DataSource" driverClassName="org.postgresql.Driver" 
		url="jdbc:postgresql://127.0.0.1:5432/lepidolite"
		username="scott" password="tiger"
		maxActive="20" maxIdle="10" maxWait="-1" />
	<Realm dataSourceName="jdbc/lepidolitedb" localDataSource="true"
		className="org.apache.catalina.realm.DataSourceRealm"
		userTable="users" userNameCol="user_id" userCredCol="passwd"
		userRoleTable="accounts" roleNameCol="role_name" digest="SHA1" />
</Context>

web.xmlの設定

<web-app>
	<security-constraint>
		<display-name>Protected Area</display-name>
		<web-resource-collection>
			<web-resource-name>Protected Area</web-resource-name>
			<url-pattern>/*</url-pattern>
		</web-resource-collection>
		<auth-constraint>
			<role-name>*</role-name>
		</auth-constraint>
	</security-constraint>

	<login-config>
		<auth-method>FORM</auth-method>
		<form-login-config>
			<form-login-page>/WEB-INF/jsp/login.jsp</form-login-page>
			<form-error-page>/error/401.jsp</form-error-page>
		</form-login-config>
 	</login-config>

	<security-role>
		<role-name>member</role-name>
	</security-role>
</web-app>

ログインページの作成(Form認証使用時)

  1. <html>
  2. <head><title>サンプル</title></head>
  3. <body>
  4. <title>Realm Sample</title>
  5. </head>
  6. <body>
  7. <form method="POST" action="j_security_check">
  8. ユーザID <input type="text" name="j_username"><br>
  9. パスワード <input type="password" name="j_password"><br>
  10. <input type="submit" value="ログイン">
  11. </form>
  12. </body>
  13. </html>

データベース

データベース使用時、レルムが参照する認証情報は2つのテーブルからなっています。

  1. ユーザIDとパスワードの組み合わせのテーブル
    ユーザ一覧 {ユーザID, パスワード}
  2. ユーザIDと権限名の組み合わせのテーブル
    権限一覧 {ユーザID, 権限名}

注意点

SSLを使用しない限り、平文のパスワードがネットワークを流れる

同一ネットワーク内の盗聴は簡単に行えます。 社内WebアプリケーションだとしてもSSLを使用しなければ、パスワードは簡単に盗まれ、なりすましがしやすくなってしまいます。

ログイン時にユーザの権限一覧を取得する

ユーザの認証, 権限付与を行うのはログイン時です。 ログイン中のユーザに対して権限を変更しても、反映されるのは次回のログイン時です。