RESTful Webサービスにおけるユーザ認証
RESTful Webサービスでユーザ認証を行う場合は、通常、HTTPの仕様で既定された標準的な認証方式(BASIC認証またはDIGEST認証)を利用します。それでは、JavaEEサーバとしてGlassFishを使用し、GlassFishにおけるBASIC認証の方法を紹介していきましょう。
GlassFishの認証機能を利用するためには、他のJavaEEサーバ製品と同じように、レルムを設定する必要があります。レルムとは、ユーザ認証を行うために必要な、一連のユーザ情報のセットのことです。ここでは、Tomcatなどでもお馴染みのデータベースを利用したレルム(JDBCレルム)を設定します。JDBCレルムを使用すると、認証に必要なユーザ情報(ユーザ名とパスワード)をテーブル上で管理できるため、大変便利です。
GlassFishとデータベースに対する設定
JDBCレルムを作成するためには、事前に以下の設定作業を行っておく必要があります。
- 接続プールとデータソースの作成
- JDBCレルムで使用するユーザテーブルとユーザグループテーブルの作成
ユーザテーブルとユーザグループテーブルは、以下のように作成します。
CREATE TABLE USER_TABLE ( USER_NAME VARCHAR(30) PRIMARY KEY, -- ユーザ名 PASSWORD VARCHAR(50) NOT NULL -- パスワード );
CREATE TABLE GROUP_TABLE ( USER_NAME VARCHAR(30) PRIMARY KEY, -- ユーザ名 GROUP_NAME VARCHAR(30) NOT NULL, -- グループ名 CONSTRAINT FK_USER_NAME FOREIGN KEY(USER_NAME) REFERENCES USER_TABLE(USER_NAME) );
GlassFishでは、管理者は、管理コンソールか管理コマンドのいずれかを使用して設定作業を行いますが、ここでは管理コマンド"asadminコマンド"を使用します。asadminコマンドは、GlassFishのインストールディレクトリのbinの下に格納されています。JDBCレルム"MyJdbcRealm"を作成するためには、以下のように入力します。引数が少々長いですが、改行することなく打ち込みます。
C:\Java\glassfish\bin>asadmin create-auth-realm --classname com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm --property jaas-context=jdbcRealm:datasource-jndi=jdbc/DerbyDS:user-table=USER_TABLE:group-table=GROUP_TABLE: user-name-column=USER_NAME:password-column=PASSWORD:group-name-column=GROUP_NAME MyJdbcRealm
"jdbc/DerbyDS"はデータソースのJNDI名を指しています。コマンド投入後、以下のように出力されれば、MyJdbcRealmが正常に作成されたことになります。
コマンド create-auth-realm は正常に実行されました。
今回の例では、ユーザにFoo、Barの2人を用意します。前述したUSER_TABLEとGROUP_TABLEには、以下のSQL文でローを挿入しておきます。USER_TABLEのパスワードカラムの値は、パスワードをMD5でハッシュ化したものです。また、Barはユーザグループ"user_gropu"に所属しているものとしてます。
INSERT INTO USER_TABLE VALUES('Foo', 'a621f6f849ec2327dabfc4392fd59a70'); INSERT INTO USER_TABLE VALUES('Bar', 'a59d77d28c59ebb32180877327b5d07d'); INSERT INTO GROUP_TABLE VALUES('Bar', 'user_group');
これでGlassFishとデータベースに対する設定は終わりです。