認可の閉塞機能を使いこなす

今回は認可の閉塞機能 (※1) についての紹介です。

2013 Summer から提供されていた認可リソースの閉塞機能ですが、2013 Winter で機能を追加して、アクション単位での閉塞 (※2) ができるようになりました。
さらに、閉塞状態を変更するための API が公開され、簡単に外部から認可リソースの閉塞状態を更新することができるようになっています。
これによって、今までは認可管理者が画面上から設定していた閉塞状態の変更を自動化できるようになりました。

閉塞 API の利用方法や、API を利用してどのようなことができるのか、サンプルを交えて説明いたします。

(※1) 認可の権限状態を変更しないまま、特定のリソースへのアクセスを制限する機能です。
(※2) 例えばメニューの場合、2013 Summer ではグローバルナビを閉塞すると参照・管理権限の両方が制限されましたが、2013 Winter からは参照と管理のいずれかを閉塞することができるようになりました。

閉塞 API の使い方

 

閉塞状態を取得・変更するには、ResourceBlocker API を使用します (Java の API のみ提供)。
http://www.intra-mart.jp/apilist/iap/javadoc/all-dev_apidocs/jp/co/intra_mart/foundation/authz/services/admin/block/ResourceBlocker.html

ResourceBlocker API は単純な3種類のメソッドを持っており、それぞれ #block, #unblock, #isBlock があります。
#block は閉塞、#unblock は閉塞を解除します。 そして #isBlock は閉塞状態を取得します。

引数にリソースグループID のみを指定するとリソース (全アクション) が閉塞され、アクションを示すリソースタイプID とアクションID を追加指定すればアクション単位での制御ができます。
動作についての詳細は API ドキュメントをご覧ください。

さて、この記事で紹介するチュートリアルでは、システムの定期メンテナンスシーンを例として、以下の動作を行ってみます。

  1. 定期メンテナンス時間になったら、閉塞機能を使用して、自動的にグローバルナビのリンクを非表示にします。
  2. 定期メンテナンス終了後、IM-Workflow を使い上司の承認を得た後、自動的にグローバルナビのリンクを戻します。
使用例1: 定期メンテナンスのため、ある特定の時刻に閉塞する (ジョブを利用した閉塞)

 

メンテナンス時間に入ったとき、自動的にグローバルナビ (PC版) を閉塞する例を考えてみます。
まず最初に、自動的に閉塞を実行するために、以下のようなジョブを作ります。

public class ResourceBlockJob extends BaseJob {
@Override
public JobResult execute() throws JobExecuteException {
try {
final ResourceBlocker blocker = ResourceBlockerFactory.getInstance().getResourceBlocker();
// グローバルナビ (PC版) のリソースグループID を指定して閉塞
blocker.block("im-menu-group-cat-im_global_nav_pc");
return new JobResult(Status.SUCCESS, "Resource of global navi was blocked.");
} catch (final ResourceBlockerException e) {
throw new JobExecuteException(e);
}
}
}

ResourceBlocker#block メソッドの引数には、閉塞したいリソースグループのIDを指定してください。

次にジョブ管理画面で 「閉塞ジョブ」 を登録します。
このとき、 「実行プログラム」 には上記で作成したクラス名の完全修飾子 (パッケージ名を含めたフル名) を設定してください。

さて、ジョブが実行されると、グローバルナビからほとんどのメニューが表示されなくなるはずです。
試しにすぐ実行してみると、グローバルナビには 「サイトマップ」 のリンク以外表示されなくなりました。

以下の URL にアクセスして、認可設定画面を開いてみましょう。
http://<HOST>:<PORT>/<CONTEXT_PATH>/tenant/authz/settings/menu_group
「グローバルナビ (PC用)」が閉塞されていることが確認できます。

 

使用例2: 上司から許可をもらい自動的に閉塞を解除する (IM-Workflow を利用した閉塞解除)

 

次に IM-Workflow を使用して、上司から承認を得たら (案件が完了したら) 自動的にグローバルナビ (PC版) の閉塞を解除する例を考えてみます。
まず最初に、自動的に閉塞を解除するために、以下のような案件終了処理を作成します。

public class ResourceUnblockProcess extends MatterEndProcessEventListener {
@Override
public boolean execute(final MatterEndProcessParameter parameter) throws Exception {
final ResourceBlocker blocker = ResourceBlockerFactory.getInstance().getResourceBlocker();
// グローバルナビ (PC版) のリソースグループID を指定して閉塞解除
blocker.unblock("im-menu-group-cat-im_global_nav_pc");
return true;
}
}

次に IM-Workflow でコンテンツ、ルート、フローを定義します。
(今回はチュートリアルのため、コンテンツ定義は IM-Workflow のサンプルを流用して、上記の案件終了処理を追加します。)

ルートは単純な直線で、メンテナンスを行った 「認可管理者」 が上司にあたる 「テナント管理者」 に閉塞解除依頼を行ってみます。

フロー定義で、「案件終了時実行プログラム」 にコンテンツ定義で登録した閉塞解除プログラムが登録されていることを確認します。

さて、実際にワークフローを流してみましょう。 ここでは 「認可管理者」 はサンプルユーザの青柳としています。
青柳でログインして、ワークフローから 「閉塞解除」 を申請します。

次にテナント管理者でログインして、未処理一覧から 「閉塞解除」 を選択し、承認します。

承認終了後、画面を再表示すると、グローバルナビの表示が復活していることが確認できました。

認可設定画面を開くと、閉塞が解除されていることも確認できます。

まとめ

 

認可リソースの閉塞 API が公開されたことで、このチュートリアルのように、特定の画面やメニューの表示・非表示制御を自動化することができました。
これにより、例えば、計画メンテナンスを行う際に、一般ユーザからのアクセスを、 時刻を指定して 遮断することが可能になります。
今回はジョブやIM-Workflow を利用して閉塞とその解除処理を自動化しましたが、他の連携プログラムを利用すればさらに多彩な動作を行うことができるようになるかと思います。

閉塞 API の実行は認可設定画面と同様に即時反映されますのでご注意ください。
機会がありましたらぜひご利用いただければと思います。