3.2. データベースを使用するためのセキュリティードメインの設定
LDAP と同様に、セキュリティードメインはログインモジュールを使用して認証および承認にデータベースを使用するように設定できます。
3.2.1. Database ログインモジュール
Database ログインモジュールは、認証およびロールマッピングをサポートする JDBC ログインモジュールです。このログインモジュールは、ユーザー名、パスワード、およびロール情報がリレーショナルデータベースに格納される場合に使用されます。
このログインモジュールは、想定される形式のプリンシパルおよびロールが含まれる論理テーブルへの参照を提供して動作します。例を以下に示します。
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
テーブルのechoman
というパワスワードを持つPrincipalID
java
-
Roles
テーブルのRolesRoleGroup
のEcho
という名前のロールを持つPrincipalID
java
-
Roles
テーブルのCallerPrincipalRoleGroup
にcaller-java
という名前のロールを持つPrincipalID
java
Database ログインモジュールの設定オプションの完全リストは、JBoss EAP『ログインモジュールのリファレンス』の「Database ログインモジュール」を参照してください。
3.2.1.1. データベースログインモジュールを使用するようセキュリティードメインを設定
Database ログインモジュールを使用するようにセキュリティードメインを設定する前に、データソースを適切に設定する必要があります。
JBoss EAP でのデータソースの作成および設定に関する詳細は、JBoss EAP『設定ガイド』の「データソース管理」を参照してください。
データソースを適切に設定したら、セキュリティードメインがデータベースログインモジュールを使用するように設定できます。以下の例では、MyDatabaseDS
という名前のデータソースが作成され、以下で構築されるデータベースで正しく設定されていることを前提としています。
CREATE TABLE Users(username VARCHAR(64) PRIMARY KEY, passwd VARCHAR(64)) CREATE TABLE UserRoles(username VARCHAR(64), role VARCHAR(32))
データベースログインモジュールを追加する 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