記事
· 2021年2月15日 4m read

ルーチン・クラスメソッド内の特定処理でデータベースの特権を変更する方法

これは 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)で作成した特権ルーチン名を使用して、以下メソッドを追記します。

  set st=$system.Security.AddRoles("TR1")

 
【実行例】

st() public {
 try {
   new $roles
   write "現在の値:",^ABC,!
   set st=$system.Security.AddRoles("TR1"// ロールの追加
   write $roles,!
   set ^ABC="変更"
   write "現在の値(更新後):",^ABC,!
 }
 catch ex {
   zwrite ex
 }
}


《ターミナル実行例》

A>set ^ABC="かきくけこ"   // ログイン時、READ許可のみのためエラー発生
SET ^ABC="かきくけこ"
^
^ABC,c:\intersystems\cache\mgr\a\
A>write ^ABC
テスト
A>do st^Test()    // ルーチン実行期間のみ更新可
現在の値:テスト
%Developer,%DB_A,R1
現在の値(更新後):変更
ディスカッション (0)0
続けるにはログインするか新規登録を行ってください