- Home ›
- サーブレット/JSP入門 ›
- ユーザー認証
BASIC認証(JDBCRealmレルム)
前回はユーザー管理をファイルで行っていましたが、今度はデータベースを用いてユーザー管理を行ってみます。データベースを使う場合には「JDBCRealmレルム」を使います。
まず「server.xml」ファイルを編集します。元々有効になっている「UserDatabaseRealm」に関する部分をコメントにし、JDBCRealm用として記述されている中のMySQLを使うものをコメントを外して有効にします。
<!-- <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> --> <Realm className="org.apache.catalina.realm.JDBCRealm" driverName="org.gjt.mm.mysql.Driver" connectionURL="jdbc:mysql://localhost/authority" connectionName="test" connectionPassword="test" userTable="users" userNameCol="user_name" userCredCol="user_pass" userRoleTable="user_roles" roleNameCol="role_name" />
それでは「JDBCRealm」レルムの使い方を詳しく見ていきます。
JDBCRealmレルム
「JDBCRealm」レルムはユーザー情報をデータベースで管理する方法で現実的にはこの方法がいいのではと思います。
設定できる属性は次の通りです。
属性 | 内容 |
---|---|
className | Javaクラス名を指定します。「org.apache.catalina.realm.JDBCRealm」を指定します。 |
driverName | 使用するJDBCドライバのJavaクラス名を指定します。MySQLの場合は「com.mysql.jdbc.Driver」を指定します。 |
connectionURL | データベースのURLを指定します。 |
connectionName | データベース接続用のユーザー名を指定します。 |
connectionPassword | データベース接続用のパスワードを指定します。 |
userTable | ユーザー名とパスワードが含まれるテーブル名を指定します。 |
userNameCol | ユーザー名が含まれるカラム名を指定します。 |
userCredCol | パスワードが含まれるカラム名を指定します。 |
userRoleTable | ロール名とユーザー名が含まれるテーブル名を指定します。 |
roleNameCol | ロール名が含まれるカラム名を指定します。 |
digest | ダイジェストアルゴリズム。SHA、MD2、MD5を指定する。省略可能でデフォルトはcleartext。 |
「className」以外はデータベースに関する設定となります。
利用するデータベースの設定
「driverName」には使用するJDBCドライバを指定します。デフォルトで「org.gjt.mm.mysql.Driver」が記述されていますが、新しいドライバーは「com.mysql.jdbc.Driver」ですので変更して下さい。
「connectionURL」には、サーブレットで「getConnection」メソッドを使う場合のURLと同じ形式で記述します。(詳しくは『データベースへの接続と切断』を参照して下さい)。
MySQLの場合次のような書式となります。
jdbc:mysql://(サーバ名)/(データベース名)
ローカルホストにある「auth」データベースを使う場合には次のようになります。
jdbc:mysql://localhost/auth
データベース内には2つのテーブルを用意します。ユーザー名とパスワードが含まれるユーザーテーブル、そしてユーザー名とロール名が含まれるロールテーブルです。それぞれデータ型は「varchar型」でいいと思います。文字数は適当に設定して下さい。
例として次のようにMySQLでデータベースとテーブルを作成しました。
またデータベースへのアクセスのためにユーザーを作成しました。
以上のデータベースを使う場合、次のようになります。
<Realm className="org.apache.catalina.realm.JDBCRealm" driverName="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost/auth" connectionName="authtest" connectionPassword="authtest" userTable="user_table" userNameCol="user" userCredCol="pass" userRoleTable="role_table" roleNameCol="role" />
ユーザーに複数のロールを設定する場合
「tomcat-users.xml」ファイルを使った場合には、ロールの指定にカンマ(,)で区切って複数のロールを記述していましたが、データベースの場合は1つのレコードにつき1つのロールしか設定できません。
その為、1人のユーザーに複数のロールを設定する場合は、ロールテーブルで複数のレコードを記述して下さい。
実際の設定例
では実際に試してみます。server.xmlのレルムの設定は先ほどのように変更しておいて下さい。
まずMySQLにユーザーを登録しておきます。今回は「itou」と「ueda」の二人のユーザーを追加しました。パスワードはユーザー名と同じです。そして「sales」ロールに所属するユーザーとして「itou」を、そして「staff」ロールに所属するユーザーとして「ueda」を追加します。
次にweb.xmlファイルを次の条件で作成します。
リソース名:User Basic Auth 対象サーブレット:このアプリケーションに含まれる全てのサーブレット 対象のHTTPメソッド:全て 許可するロール名:sales 認証方式:BASIC認証 レルム名:User Basic Auth
作成したweb.xmlファイルは次の通りです。(前のページのサンプルと変更ありません)。
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> <servlet> <servlet-name>AuthTest1</servlet-name> <servlet-class>AuthTest1</servlet-class> </servlet> <servlet-mapping> <servlet-name>AuthTest1</servlet-name> <url-pattern>/AuthTest1</url-pattern> </servlet-mapping> <servlet> <servlet-name>AuthTest2</servlet-name> <servlet-class>AuthTest2</servlet-class> </servlet> <servlet-mapping> <servlet-name>AuthTest2</servlet-name> <url-pattern>/AuthTest2</url-pattern> </servlet-mapping> <security-constraint> <web-resource-collection> <web-resource-name>User Basic Auth</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>sales</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> <realm-name>User Basic Auth</realm-name> </login-config> <security-role> <role-name>sales</role-name> </security-role> </web-app>
それでは一度サーブレットを再起動してから、ブラウザで「http://localhost:8080/auth/AuthTest1」へアクセスして下さい。
上記のようにユーザー名とパスワードを入力するダイアログが表示されます。先ほど登録したユーザー名「itou」パスワード「itou」を入力します。
「itou」はユーザー認証が通り、所属するロールがアクセス許可に設定してるため、ページを見ることができます。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。