ルーチン・クラスメソッド内の特定処理でデータベースの特権を変更する方法
これは InterSystems FAQ サイトの記事です。
「特権ルーチンアプリケーション」を使用し、コード中に $system.Security.AddRoles()メソッドを使用してロールを付与する仕組みを利用します。
※ロールベースで必要な特権を付与するため、予め特定の特権を持ったロールを作成する必要があります。
詳細は、以下ドキュメントをご参照ください。
特権ルーチン・アプリケーション【IRIS】
特権ルーチン・アプリケーションについて
例えば、特定ルーチン(またはクラスメソッド)実行時のみデータベースの更新を許可するための設定は、以下のとおりです。
(接続するデータベースに対してはREAD許可だけを持ち、あるルーチン実行時のみデータベースに対するREAD/WRITE許可を持つように設定します。)
1) データベース:Aのリソース定義を確認する
データベース:Aのリソースに %DB_%DEFAULT が設定されている場合は、独自リソースを作成します。
(データベースに割り当てられたリソースの確認は、管理ポータル > [システム管理] > [構成] > [システム構成] > [ローカルデータベース] > リソース で確認できます)
リソース作成は、管理ポータル > [システム管理] > [セキュリティ] > [リソース] > 新規リソース作成ボタン押下
データベースリソースは命名規則があり、 %DB_データベース名 を指定します。
例の場合は、 %DB_A を登録します。このとき、パブリック許可は全てチェックを外します。
リソース作成が完了したら、管理ポータル > [システム管理] > [構成] > [システム構成] > [ローカルデータベース] から設定対象のデータベース設定を開き、リソース名を変更し、保存します。
2) READ許可のみを付与するロールを作成する
管理ポータル > [システム管理] > [セキュリティ] > [ロール] > 新規ロール作成ボタン押下
ロール名を記入し、保存します。(ロール名を R1 とします。)
作成したロールに特権(リソースに対する許可の組み合わせ)を登録するため、追加ボタンを押下し、利用可能なリソース一覧から、1)で確認したリソース名を選択します。
選択後、リソースの許可をRのみに変更し、ロールを保存します。
3) アクセスするユーザのログインロールを確認する。
例では、ターミナルでのルーチン(またはクラスメソッド)実行で確認を行うため、ターミナルログイン時にユーザ認証を行うよう、適切なサービス(Windowsなら%Service_Console)の認証方法に「パスワード」を追加します。
任意ユーザに対して、%Developerロールと 2) で作成したロールを付与します。
4) 特権ルーチンアプリケーションの作成
実行時にREAD/WRITE許可を追加するための「特権ルーチンアプリケーション」を作成します。
管理ポータル > [システム管理] > [セキュリティ] > [アプリケーション] > [特権ルーチンアプリケーション] > 作成用ボタン押下
特権ルーチンアプリケーション名を指定し保存します。(特権ルーチンアプリケーション名を TR1 とします。)
ルーチンタブを開き、ルーチン(またはクラスメソッド)があるデータベースの指定と、名前の指定を行います。
続いて、アプリケーション・ロールタブを開き、データベース:A のDBロール(%DB_Aロール)を付与します。
※ DBロールはDBリソース作成時、自動的に作成されるロールで、DBリソースに対するREAD/WRITE許可を持つロールです。
5) コード内でロールを付与する。
4)で作成した特権ルーチン名を使用して、以下メソッドを追記します。
【実行例】
try {
new $roles
write "現在の値:",^ABC,!
set st=$system.Security.AddRoles("TR1") // ロールの追加
write $roles,!
set ^ABC="変更"
write "現在の値(更新後):",^ABC,!
}
catch ex {
zwrite ex
}
}
《ターミナル実行例》
SET ^ABC="かきくけこ"
^
^ABC,c:\intersystems\cache\mgr\a\
A>write ^ABC
テスト
A>do st^Test() // ルーチン実行期間のみ更新可
現在の値:テスト
%Developer,%DB_A,R1
現在の値(更新後):変更