1. 認可機能について
iPLAssでは標準機能として認可に対する機能が組み込まれています。 以下の機能・特徴があります。
-
ロールベースの権限制御
ユーザをロールに分類し、ロールに対して機能ごとの権限を設定します。 ロールの作成や権限の作成機能と、設定された権限によるアクセス制御を行います。
ロールに対して権限を設定することで、個々のユーザに対してではなく、ある範囲のユーザに対してまとめて権限を制御する事が可能です。
2. 権限情報の管理
iPLAssでの権限情報は、 Entityとして管理します。
-
ロール
対象ユーザを決めるための条件を設定し、ロールに分類します。
ロールはユーザを作成する際にユーザごとに設定するのではなく、ロールで設定された条件によってユーザに付与されます。 -
Entity権限、Action権限、WebApi権限、Workflow権限、UserTask権限、Cube権限
ロールに対して、それぞれの機能ごとの権限を設定します。
データの登録、編集は、標準の「権限」メニューから起動される汎用画面で行うか、 管理者(admin)であれば、AdminConsoleの「PermissionExplorer」から行うことができます。 PermissionExplorerの詳細は PermissionExplorerを参照してください。
それぞれのEntityについて説明します。
2.1. ロール管理
ロールは、Role
エンティティとして管理します。
mtp.auth.Role
ロールに適用する条件を設定します。
項目名 | 内容 |
---|---|
ロールコード |
任意のロールコードを指定します。テナント単位で一意である必要があります。必須項目です。 |
名前 |
ロールの表示名を指定します。 |
優先順位 |
優先順位を設定します。Action権限等にロールを複数設定した場合に適用させるロールの優先順位となります。 |
説明 |
本ロールの説明を設定します。 |
ユーザを特定するための条件を設定します。 |
項目名 | 内容 |
---|---|
このロールに設定されているAction権限です。 |
|
このロールに設定されているEntity権限です。 |
|
このロールに設定されているWebApi権限です。 |
|
このロールに設定されているWorkflow権限です。 |
|
このロールに設定されているUserTask権限です。 |
|
このロールに設定されているCube権限です。 |
権限の情報は編集できません。権限の設定側でロールを指定します。 |
ロール条件
ロール条件はGroovyScript形式で定義します。
ユーザ情報などチェック対象の属性がバインド変数として渡されるので、判定結果を true/false
で返すように実装します。
ロール条件は複数設定することができます。複数設定した場合はORとして判定します。
どれか1つでも true
であればロールに該当すると判断されます。
いくつか例を示します。
-
User
エンティティの所属グループで判定
所属グループ(groups
)を条件としたい場合、以下のようにグループコードを指定することで、そのグループに属しているメンバーを条件とすることができます。 グループは階層構造を持っているため、memberOf
関数が提供されています。user.memberOf("TEST001")
-
User
エンティティのランクで判定
所属ランク(rank
)も条件に指定可能です。「ユーザのランクのレベル属性が5以上」といった定義になります。user.rank.level > 5
-
未ログインユーザの判定
未ログインユーザを条件とする場合はanonymousフラグを利用します。 anonymousフラグはユーザ情報のプロパティではありませんが、ログイン状態に応じてuserに付与されています。user.anonymous==true
バインド変数などの詳細は各種条件の書式を参照してください。
2.2. 権限管理
権限は機能ごとにエンティティが用意されています。 それぞれの機能ごとに、対象とする機能、対象ロール、許可する権限を設定します。
Entity権限
Entityに対する権限は、EntityPermission
エンティティとして管理します。
mtp.auth.EntityPermission
Entityの各操作(登録、参照、更新、削除)の許可/拒否及び、許可範囲の設定を行います。 また、プロパティ単位で許可するプロパティを指定できます。
Entityレベルでの許可範囲はあくまでEntity単位に対してのものであり、プロパティに対してのものではありません。 対象Enitty内のプロパティに対して、自ユーザのデータは参照可能、他ユーザのデータは参照不可、といった指定はできません。 そのような制御をしたい場合は、参照可能範囲を変えたい属性類を別Entityに定義してEntityレベルで参照範囲を絞って下さい。 尚、参照プロパティについては、参照先エンティティの権限も設定する必要があります。
項目名 | 内容 |
---|---|
名前 |
Entity権限の表示名を設定します。 |
対象Entity |
対象とするEntityを設定します。 |
ロール |
対象とするロールを設定します。 |
項目名 | 内容 |
---|---|
参照 |
参照操作に対する、「許可」、「不許可」を設定します。 |
参照可能範囲を設定します。 |
|
参照プロパティの制御 |
「参照プロパティのリスト」プロパティに対して、「参照可」、「参照不可」を設定します。 |
参照プロパティのリスト |
対象とするプロパティを設定します。カンマ区切り、もしくはスペース区切りで複数指定が可能です。 |
項目名 | 内容 |
---|---|
登録 |
登録操作に対する、「許可」、「不許可」を設定します。 |
登録可能範囲条件 |
参照可能範囲条件と同じ書式で設定します。 |
登録プロパティの制御 |
「登録プロパティのリスト」プロパティに対して、「登録可」、「登録不可」を設定します。 |
登録プロパティのリスト |
対象とするプロパティを設定します。カンマ区切り、もしくはスペース区切りで複数指定が可能です。 |
項目名 | 内容 |
---|---|
更新 |
更新操作に対する、「許可」、「不許可」を設定します。 |
更新可能範囲条件 |
参照可能範囲条件と同じ書式で設定します。 |
更新プロパティの制御 |
「更新プロパティのリスト」プロパティに対して、「更新可」、「更新不可」を設定します。 |
更新プロパティのリスト |
対象とするプロパティを設定します。カンマ区切り、もしくはスペース区切りで複数指定が可能です。 |
項目名 | 内容 |
---|---|
削除 |
削除操作に対する、「許可」、「不許可」を設定します。 |
削除可能範囲条件 |
参照可能範囲条件と同じ書式で設定します。 |
参照可能範囲条件
参照可能範囲条件は、 PreparedQuery(GroovyTemplate)形式で定義します。 対象のエンティティに対するWHERE条件を設定します。
ユーザ情報等がバインド変数として用意されており、条件として利用することができます。
バインド変数を利用する場合は$で括る必要があります。 |
いくつか例を示します。
-
直接文字列で指定
col01
プロパティの値が01
のもののみを対象とする場合は以下のように記述します。col01='01'
-
バインド変数
user
を利用
バインド変数を利用する場合は以下のように記述します。oid = '${user.oid}'
-
inの指定
下記のようにtoIn
を利用し、プロパティの型に対応する値のCollection、配列、単一オブジェクトを指定する事も可能です。 ただし、参照型に対してEntityを直接指定することは出来ません。group.oid in (${toIn(user.groupOid)}) group.oid in (${toIn(user.groupOidWithChildren)}) groupCode in (${toIn(user.groupCode)}) groupCode in (${toIn(user.groupCodeWithChildren)}) customPropertyCode in (${toIn(user.customPropertyCode)})
-
副問い合わせでの注意点
Oracleを利用している場合に、条件式に以下のような形で副問い合わせで定義した場合、OracleでORA-01799エラーが発生します。 (refer句にて、oid=(Select ~)を記述するとエラーとなる)oid=(select groups.oid from mtp.auth.User where oid='${user.oid}')
oidに対して副問い合わせを限定条件として記述したい場合、下記のように定義してください。
oid in (select groups.oid from mtp.auth.User where oid='${user.oid}')
Action権限
Actionに対する権限は、ActionPermission
エンティティとして管理します。
mtp.auth.ActionPermission
特定のActionに対してのアクセス制御が可能です。
項目名 | 内容 |
---|---|
名前 |
Action権限の表示名を設定します。 |
対象とするAction名を指定します。 |
|
ロール |
対象とするロールを設定します。 |
項目名 | 内容 |
---|---|
許可する条件を記述します。 |
対象Actionの指定
Action名を個別に指定する以外に、ワイルドカード(*を指定可能)を利用する事もできます。 設定するのはコンテキスト、テナント名を除くアクション名のみとなります。
例)下記URLのサービスに対して制御する場合(mtpがコンテキスト、demoがテナント名)
-
hogehogeアクションのみを制御したい場合
site/hogehoge
-
site配下を制御したい場合
site/*
許可条件
許可条件はGroovyScript形式で定義します。
ユーザ情報やリクエストパラメータなどチェック対象の属性がバインド変数として渡されるので、判定結果を true/false
で返すように実装します。
いくつか例を示します。
-
全てを許可
設定したロールを保持するユーザ全てに対して許可したい場合はtrue
と設定して下さい。true
-
リクエストパラメータで制限
リクエストパラメータを条件に指定する事も可能です。parameter.defName == 'HogeEntity'
-
リクエストパラメータで複数の値をチェック(in)
in
句を利用して第一引数にパラメータ名、第二引数以降に条件としたい値を指定することも出来ます。parameter.in('defName', 'HogeEntity', 'FugaEntity')
-
複数のリクエストパラメータで制限
parameter.defName == 'HogeEntity' && parameter.aaa == '1'
バインド変数などの詳細は各種条件の書式を参照してください。
WebApi権限
WebApiに対する権限は、WebApiPermission
エンティティとして管理します。
mtp.auth.WebApiPermission
特定のWebApiに対してのアクセス制御が可能です。
項目名 | 内容 |
---|---|
名前 |
WebApi権限の表示名を設定します。 |
対象WebApi |
対象とするWebApi名を指定します。指定方法はAction権限の対象Actionと同様です。 |
ロール |
対象とするロールを設定します。 |
項目名 | 内容 |
---|---|
許可条件 |
許可する条件を記述します。指定方法はAction権限の許可条件と同様です。 |
Workflow権限
Workflowに対する権限は、WorkflowPermission
エンティティとして管理します。
mtp.auth.WorkflowPermission
Workflow権限はあくまでワークフローを起動する為の権限であり、承認タスクなどはワークフロー内の設定に従います。
ここで設定された許可条件に該当するユーザがWorkflowを開始することができます。 Workflowに対してWorkflow権限が1つも設定されていない場合、全ユーザに許可されます。
項目名 | 内容 |
---|---|
名前 |
Workflow権限の表示名を設定します。 |
対象Workflow |
対象とするWorkflow名を指定します。 |
ロール |
対象とするロールを設定します。 |
項目名 | 内容 |
---|---|
許可条件 |
UserTask権限
UserTaskに対する権限は、UserTaskPermission
エンティティとして管理します。
mtp.auth.UserTaskPermission
UserTask権限は割り当て済みのタスクを割り当てられてないユーザが操作するための権限です。
項目名 | 内容 |
---|---|
名前 |
UserTask権限の名称を設定します。 |
対象Workflow |
対象Workflowを設定します。 |
対象UserTask |
対象UserTaskを設定します。 |
ロール |
対象とするロールを設定します。 |
項目名 | 内容 |
---|---|
管理 |
管理操作に対する、「許可」、「不許可」を設定します。 |
管理可能範囲条件 |
管理可能範囲を設定します。
指定方法はEntity権限の参照可能範囲条件と同様です。
|
Cube権限
Cubeに対する権限は、CubePermission
エンティティとして管理します。
mtp.auth.CubePermission
特定のCubeに対してのアクセス制御が可能です。
項目名 | 内容 |
---|---|
名前 |
Cube権限の名称を設定します。 |
対象Cube |
対象Cubeを設定します。 |
ロール |
対象とするロールを設定します。 |
項目名 | 内容 |
---|---|
参照 |
参照操作に対する、「許可」、「不許可」を設定します。 |
参照可能範囲条件 |
参照可能範囲を設定します。指定方法はEntity権限の参照可能範囲条件と同様です。 |
参照項目の制御 |
「参照項目のリスト」プロパティに対して、「参照可」、「参照不可」を設定します。 |
参照項目のリスト |
対象とするプロパティを設定します。カンマ区切り、もしくはスペース区切りで複数指定が可能です。 |
2.3. 各種条件の書式
条件として指定する方法には、GroovyScript形式で true
/ false
を返す記述と、
PreparedQuery(GroovyTemplate)形式で記述する方式が存在します。
GroovyScript形式
GroovyScript形式で条件を設定するEntityは以下になります。
Entity | 設定項目 | バインド変数 | バインド内容 |
---|---|---|---|
ロール |
ロール条件,条件文 |
user |
ユーザ情報が取得できます。 |
session |
セッション情報が取得できます。(バッチなど、APサーバ経由の起動以外の場合はバインドされません。) |
||
request |
リクエストの情報が取得できます。また、下記の情報が取得可能です。
|
||
Action権限 |
許可条件 |
user |
ユーザ情報が取得できます。 |
session |
セッション情報が取得できます。 |
||
action |
Action名が取得できます。 |
||
parameter |
リクエストパラメータの値が取得できます。 |
||
WebAPI権限 |
許可条件 |
user |
ユーザ情報が取得できます。 |
session |
セッション情報が取得できます。 |
||
webAPI |
webAPI名が取得できます。 |
||
parameter |
リクエストパラメータの値が取得できます。 |
||
Workflow権限 |
許可条件 |
user |
ユーザ情報が取得できます。 |
session |
セッション情報が取得できます。(バッチなど、APサーバ経由の起動以外の場合はバインドされません。) |
||
workflow |
workflow名が取得できます。 |
||
parameter |
リクエストパラメータの値が取得できます。 |
PreparedQuery形式
PreparedQuery(GroovyTemplate)形式で条件を設定するEntityは以下になります。
Entity | 設定項目 | バインド変数 | バインド内容 |
---|---|---|---|
Entity権限 |
参照可能範囲条件 |
user |
ユーザ情報が取得できます。 |
session |
セッション情報が取得できます。(バッチなど、APサーバ経由の起動以外の場合はバインドされません。) |
||
Cube権限 |
参照可能範囲条件 |
user |
ユーザ情報が取得できます。 |
session |
セッション情報が取得できます。(バッチなど、APサーバ経由の起動以外の場合はバインドされません。) |
特定のグループに対応した条件が必要で、範囲条件内に直接グループコードを記述する必要がある(環境に依存する自動採番のoidでは無く、固定値のグループコードを利用したい)場合、toGroupOidを利用した下記コードが利用可能です。
groups.oid in (${toIn(toGroupOid(['G01','G02']))})
ユーザの所属グループのoidを直接利用したい場合は"user.groupOid"等をご利用下さい。
特殊なバインド変数
バインド変数の利用方法、書式について説明します。
ユーザ情報
ユーザに紐づく情報は条件式内で user.プロパティ名
と記述することで利用可能です。
例えば、 user.accountId
でユーザの accountId
が取得できます。
GroovyScript形式の場合は user.プロパティ名
で取得可能です。
PreparedQueryの場合は ${user.プロパティ名}
と変数を ${}
で囲う必要があります。
ユーザEntityに設定済のプロパティ以外にも取得可能な情報は以下になります。
プロパティ名 | 内容 |
---|---|
admin |
Admin権限をもつユーザ場合 |
temporary |
temporaryユーザの場合 |
anonymous |
anonymousユーザの場合 |
localAdmin |
共有テナント時のみ有効で、紐づいているテナントでAdmin権限を持つユーザの場合は |
otherTenant |
共有テナント時のみ有効で、他テナントに紐づくユーザの場合は |
tenantId |
テナントIDが返却します。 |
groupCodeWithChildren |
所属するグループの子グループも含めグループコードを返却します。 |
groupCodeWithParents |
所属するグループの親グループも含めグループコードを返却します。 |
groupOidWithChildren |
所属するグループの子グループも含めoidを返却します。 |
groupOidWithParents |
所属するグループの親グループも含めoidを返却します。 |
groupOid |
属しているグループ情報全てを配列で返却します。 |
また、 user.memberOf
という関数が利用できます。
項目名 | 内容 |
---|---|
memberOf(グループコード) |
対象グループに属している場合は |
リクエスト情報
アプリ側でログイン時や任意の処理等でパラメータにセットした値を取得する事が可能です。
def value = parameter.パラメータ名
def value = parameter.getValue("パラメータ名") (1)
1 | パラメータ名に"."が含まれている場合に利用されることを想定 |
また、下記のようにin句を利用可能です。 この場合、defNameがHogeEntityもしくはFugaEntityだった場合にtrueが返ります。
parameter.in('defName', 'HogeEntity', 'FugaEntity')
セッション情報
アプリ側でログイン時や任意の処理等でセッションにセットした値を取得する事が可能です。
def value = session.項目名;
def value = session.getAttribute("項目名"); (1)
1 | 項目名に"."が含まれている場合に利用されることを想定 |
カスタム処理の利用
独自で作成したユーティリティクラス等をインポートし利用する事が可能です。 複雑な処理で抽出した条件をwhere句としたい場合等に利用して下さい。
例えば、 org.iplass.sample.SampleUtil
クラスを利用したい場合は以下のように記述します。
インポートの仕方がGroovyScript形式と、PreparedQuery(GroovyTemplate)形式で異なります。
-
GroovyScript形式の場合
import org.iplass.sample.SampleUtil; return SampleUtil.isAccess();
上記のような条件をAction権限に設定することで、Action権限の制御をユーティリティクラスで制御できます。
-
PreparedQuery(GroovyTemplate)形式の場合
<%@import org.iplass.sample.SampleUtil%> <% String tempOid = SampleUtil.getOid(); %> oid = ${tempOid}
TestUtilクラスのgetOid()メソッドにより返却されるoidを条件としたEQLとなります。
3. 特殊な権限の利用
3.1. 特権実行
Action、WebApiに対して、特権を設定する事が可能です。
特権実行とは、対象Action、WebApiの実行を、セキュリティの制約を一切受ける事なく実行可能にするものです。
また、Action、WebApiの実行を特権実行にせずに、実行されるロジックの一部のみを特権として実行する事も可能です。
この場合は下記のように AuthContext.doPrivileged
を利用します。
import org.iplass.mtp.auth.AuthContext;
AuthContext.doPrivileged(()-> {
・・・・・
});
EntityのLoad処理を特権実行で実行する場合の例を示します。
import org.iplass.mtp.ManagerLocator;
import org.iplass.mtp.auth.AuthContext;
import org.iplass.mtp.entity.Entity;
import org.iplass.mtp.entity.EntityManager;
final EntityManager em = ManagerLocator.manager(EntityManager.class);
//特権でload処理を実行
Entity entity = AuthContext.doPrivileged(()-> {
return em.load("012345", "SampleEntity001");
});
Command内で検索は通常に処理し、更新は特権で実行する場合の例を示します。 更新部分のみを特権実行にすることで、必要最低限の特権実行とすることが出来ます。
public final class PrivelegeSampleCommand implements Command {
@Override
public String execute(RequestContext request) {
final EntityManager em = ManagerLocator.manager(EntityManager.class);
// 通常検索
final Entity entity = em.load("012345", "SampleEntity001");
entity.setDescription("sample description");
// 更新は特権で実行
AuthContext.doPrivileged(()->{
UpdateOption option = new UpdateOption();
option.add("description");
em.update(entity, option);
});
return "SUCCESS";
}
}