3.2. データベースを使用するようにセキュリティードメインを設定する手順
LDAP と同様に、セキュリティードメインはログインモジュールを使用して認証および承認にデータベースを使用するように設定できます。
3.2.1. Database ログインモジュール
Database ログインモジュールは、認証とロールマッピングをサポートする JDBC (Java Database Connectivity) ベースのログインモジュールです。このログインモジュールは、ユーザー名、パスワード、およびロール情報がリレーショナルデータベースに格納される場合に使用されます。
このログインモジュールは、想定される形式のプリンシパルおよびロールが含まれる論理テーブルへの参照を提供して動作します。以下に例を示します。
Table Principals(PrincipalID text, Password text) Table Roles(PrincipalID text, Role text, RoleGroup text)
Principals テーブルは、PrincipalID ユーザーと有効なパスワードを、Roles テーブルは PrincipalID ユーザーとそのロールセットを関連付けます。ユーザーのパーミッションに使用するロールは、Roles の roleGroup コラムの値が含まれる行に追加する必要があります。
ユーザーがログインモジュールが使用する SQL クエリーを指定できる点で、これらのテーブルは論理的であるといえます。唯一の要件は、java.sql.ResultSet に、先程説明した Principals と Roles テーブルと同じ論理構造を使用する必要があることです。テーブルとコラムの実際の名前は、コラムインデックスに基づいて結果にアクセスするため、重要ではありません。
この概念を明確化するには、すでに宣言済みの Principals と Roles の 2 つのテーブルが含まれるデータベースを思い浮かべてください。以下のステートメントでは、テーブルに以下のデータが投入されます。
-
PrincipalsテーブルにはPrincipalIDがjavaでパスワードがechomanのデータを投入 -
RolesテーブルのRolesRoleGroupにはPrincipalIDがjavaでロールがEchoのデータを投入 -
RolesテーブルのCallerPrincipalRoleGroupにはPrincipalIDがjavaでロールがcaller-javaのデータを投入
Database ログインモジュールの設定オプションの完全リストは、JBoss EAP ログインモジュールのリファレンスの Database ログインモジュール を参照してください。
3.2.1.1. Database ログインモジュールを使用するようにセキュリティードメインを設定する手順
Database ログインモジュールを使用するようにセキュリティードメインを設定する前に、データソースを適切に設定する必要があります。
JBoss EAP でのデータソースの作成および設定に関する詳細は、JBoss EAP設定ガイドのデータソース管理 を参照してください。
データソースを適切に設定した後に、Database ログインモジュールを使用するようにセキュリティードメインを設定できます。以下の例は、MyDatabaseDS という名前のデータソースが作成済みで、以下で構築されるデータベースを使用して適切に設定されていることが前提です。
CREATE TABLE Users(username VARCHAR(64) PRIMARY KEY, passwd VARCHAR(64)) CREATE TABLE UserRoles(username VARCHAR(64), role VARCHAR(32))
Database ログインモジュールを追加する CLI コマンド
/subsystem=security/security-domain=testDB:add
/subsystem=security/security-domain=testDB/authentication=classic:add
/subsystem=security/security-domain=testDB/authentication=classic/login-module=Database:add(code=Database,flag=required,module-options=[("dsJndiName"=>"java:/MyDatabaseDS"),("principalsQuery"=>"select passwd from Users where username=?"),("rolesQuery"=>"select role, 'Roles' from UserRoles where username=?")])
reload