intra-mart Accel Platform TERASOLUNA Server Framework for Java (5.x) プログラミングガイド 第17版 2022-12-01

認可

画面にアクセス権限を設定するために

@RequestMapping()
public String index() {
    return "index.jsp";
}
Controllerクラスの設定により画面へのアクセスが可能になりました。
しかし、このままでは@RequestMappingメソッドの処理が行われる際に認可処理が省略されるため、誰でも画面を表示できます。
実際にシステムを運用する際は、アクセス権限を設定して特定のユーザのみに画面を表示させ、アクセスの制限をかける場合がほとんどです。
この章では、 intra-mart Accel Platform で用意されている認可機能を利用して、用意した画面を特定のユーザにのみ表示させる手順を説明します。
Controllerクラス、@RequestMappingメソッドの詳細については 「Annotated Controllers」 を参照してください。

認可とは

認可の概要

認可とは、認証機能によって特定されたユーザが要求するリソースへのアクセスを制御する機能です。
intra-mart Accel Platform では、 「誰が」「何を」「どうする」 を 「許可」「禁止」 で判定する共通的な認可機能の仕組みを提供しています。
../../../_images/authz_flow.png

サブジェクト

認可での 「サブジェクト」 は、「誰が」 の部分を示します。
intra-mart Accel Platform では 「ユーザ」「ロール」「会社・組織」「役職」「パブリックグループ」「パブリックグループ・役割」 の組み合わせで、権限を与える対象者を設定できます。
../../../_images/authz_treegrid_subject.png

リソースとリソースグループ

認可での 「リソース」 は、「何を」 の部分を示します。
例えば、画面や Web サービスなどのサービス系、メニューやポータルなどのデータ系があります。
リソースは、 「リソースグループ」 によって親子階層を持たせることができます。
../../../_images/authz_treegrid_resource.png

リソースタイプとアクション

認可での 「アクション」 は、「どうする」 の部分を示します。
アクションの内容はリソースの種類(リソースタイプ)によって決まります。
例えば、画面では 「実行」 というアクションを 1 つのみ持っています。
../../../_images/authz_treegrid_action.png

ポリシー

認可での 「ポリシー」 は、「許可」「禁止」 の部分を示します。
各サブジェクト・リソース・アクションの組み合わせ分、ポリシーを設定できます。
../../../_images/authz_treegrid_policy.png
ポリシーが未設定状態の場合は、親階層のリソースグループの権限を引き継ぎます。
最上位階層のリソースグループのポリシーが未設定の場合、 「禁止」 として扱います。

画面へアクセスするための認可設定方法

権限設定の流れ

ルータでは @RequestMapping メソッドに設定された情報に基づいて認可に権限の問い合わせを行います。
問い合わせを行う際は、キーとして各リソース別に割り当てられた URI を使用します。
../../../_images/router_authz_chain.png
画面の権限設定をする場合の作業手順は以下の通りです。
  1. @RequestMapping メソッドに認可を紐づける
  2. 認可のリソースグループ、リソースを登録する
  3. リソースに対して権限を設定する

ステップ1:@RequestMappingメソッドに認可を紐づける

認可に紐づけるため、 @RequestMapping メソッドに @Authz アノテーションを記述します。
@Authz(uri = "service://sample/foo", action = "execute")
@RequestMapping()
public String index() {
    return "index.jsp";
}
画面の場合、 uri プロパティには “service://” で始まる文字列を指定します。
ここの “service” が 「リソースタイプ」 を示す文字列で、 “service” は 「画面・処理」 を表します。
リソースタイプ “service” には、アクションとして “execute”(実行)が 1 つのみ用意されています。
そのため、 action 属性には “execute” を指定しておきます。

ステップ2:認可のリソースグループ、リソースを登録する

サンプルで作成した画面と認可を紐づけるため、認可に対して以下の構成でリソースグループとリソースを登録します。
../../../_images/sample_resource_tree.png
リソースグループとリソースは 「認可設定画面から登録する方法」 と 「ジョブを利用してファイルから登録する方法」 があります。
認可設定画面からリソースを登録する場合は、 ステップ2-1:認可設定画面を利用して認可のリソースグループ、リソースを登録する の操作を行ってください。
ジョブを利用してファイルから登録するリソースを登録する場合は、 ステップ2-2:ジョブを利用して認可のリソースグループ、リソースを登録する の操作を行ってください。

ステップ2-1:認可設定画面を利用して認可のリソースグループ、リソースを登録する

テナント管理者で intra-mart Accel Platform にログインします。
http://<HOST>:<PORT>/<CONTEXT_PATH>/login
「サイトマップ」→「テナント管理」→「認可」の順にクリックします。
認可設定画面が開きますので、 「権限設定を開始する」ボタンをクリックします。
../../../_images/authz_settings_edit_start.png
まずはリソースグループを登録します。
リソース列の 「画面・処理」 にマウスカーソルを合わせると右側にアイコンが表示されますので、アイコンをクリックします。
../../../_images/authz_settings_open_policy_detail.png
「リソースの詳細」 ダイアログの 「配下にリソースを新規作成」 をクリックします。
../../../_images/authz_settings_policy_detail_new.png
「リソースグループID」 のテキストボックスに 「guide-sample-service」 を入力します。
「リソースグループ名」 の最も上のテキストボックスに 「プログラミングガイドのサンプル」 を入力します。
「リソースURI」 と 「説明」 は未入力のままでかまいません。
「OK」 ボタンをクリックします。 これでリソースグループが登録されました。
../../../_images/authz_settings_policy_new_dialog.png

コラム

「リソースグループID」 には任意の ID を指定できます。
「リソースURI」 を未入力状態にして登録することで、リソースをグループ化するためのリソースグループを作成できます。

実際の開発時は、認可管理者に対して登録したリソースグループがどの画面・処理・データを表しているか明示するために、「説明」 を設定することをお勧めします。
「リソースの詳細」 ダイアログの 「リソースの階層」 から、作成した 「プログラミングガイドのサンプル」 を探します。
同じ行の右側にある 「開く」 アイコンをクリックします。
「プログラミングガイドのサンプル」 が選択されます。
../../../_images/authz_settings_policy_detail_child.png

注意

リソースグループの配下にリソースが登録されていない場合、権限設定のグリッド上には表示されません。
「リソースの階層」 には表示されます。

コラム

「リソースの階層」 には選択されているリソース(グループ)の親階層と、子階層(1 階層)が表示されます。
次にリソースを登録します。
「リソースの詳細」 ダイアログの 「配下にリソースを新規作成」 をクリックします。
「リソースグループID」 のテキストボックスに 「guide-sample-foo-service」 を入力します。
「リソースグループ名」 の最も上のテキストボックスに 「Hello World」 を入力します。
「リソースURI」 のテキストボックスに 「service://sample/foo」 を入力します。
「説明」 は未入力のままでかまいません。
「OK」 ボタンをクリックします。 これでリソースが登録されました。
../../../_images/authz_settings_policy_detail_new2.png

コラム

「リソースグループID」 には任意の ID を指定できます。
「リソースURI」 にはルーティングテーブルで指定した authz タグの uri 属性と同じ値を指定します。
「リソースURI」 を入力して登録することで、画面などのリソースに紐づくリソースを作成できます。

実際の開発時は、認可管理者に対して登録したリソースがどの画面・処理・データを表しているか明示するために、「説明」 を設定することをお勧めします。
「リソースの詳細」 ダイアログの右上の 「×」 アイコンをクリックしてダイアログを閉じます。
これで認可に対して画面の表示に必要なリソースグループとリソースが登録できました。
次にステップ3 の操作を行います。

ステップ2-2:ジョブを利用して認可のリソースグループ、リソースを登録する

空の<authz-resource-group.xml>ファイルを作成して、以下を入力し保存します。
<?xml version="1.0" encoding="UTF-8"?>
<root
  xmlns="http://www.intra-mart.jp/authz/imex/resource-group"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.intra-mart.jp/authz/imex/resource-group authz-resource-group.xsd">

  <authz-resource-group id="guide-sample-service">
    <display-name>
      <name locale="ja">プログラミングガイドのサンプル</name>
    </display-name>
    <resource-group-description>
      <description locale="ja">プログラミングガイドのサンプルです。</description>
    </resource-group-description>
    <parent-group id="http-services" />
  </authz-resource-group>

</root>

注意

文字コードを UTF-8 にして保存してください。

コラム

authz-resource-group タグの id 属性には任意の ID を指定できます。
parent-group タグの id 属性には “http-services” を指定してください。

resource-group-description タグにはリソースグループの説明を指定できます。 タグは省略可能です。
実際の開発時は、認可管理者に対して登録したリソースグループがどの画面・処理・データを表しているか明示するために、説明を指定することをお勧めします。
次に、空の<authz-resource.xml>ファイルを作成して、以下を入力し保存します。
<?xml version="1.0" encoding="UTF-8"?>
<root
  xmlns="http://www.intra-mart.jp/authz/imex/resource"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.intra-mart.jp/authz/imex/resource authz-resource.xsd">

  <authz-resource id="guide-sample-foo-service" uri="service://sample/foo">
    <display-name>
      <name locale="ja">Hello World</name>
    </display-name>
    <resource-description>
      <description locale="ja">プログラミングガイドのサンプルです。</description>
    </resource-description>
    <parent-group id="guide-sample-service" />
  </authz-resource>

</root>

注意

文字コードを UTF-8 にして保存してください。

コラム

authz-resource タグの id 属性には任意の ID を指定できます。
uri 属性には@RequestMappingメソッドで指定した @Authz アノテーションの uri プロパティと同じ値を指定します。
parent-group タグの id 属性には、先ほど作成した authz-resource-group の id 属性と同じ値を指定します。

resource-description タグにはリソースの説明を指定できます。 タグは省略可能です。
実際の開発時は、認可管理者に対して登録したリソースがどの画面・処理・データを表しているか明示するために、説明を指定することをお勧めします。
作成した<authz-resource-group.xml>と<authz-resource.xml>のファイルを、 %PUBLIC_STORAGE_PATH% 直下に配置します。
テナント管理者で intra-mart Accel Platform にログインします。
http://<HOST>:<PORT>/<CONTEXT_PATH>/login
「サイトマップ」→「テナント管理」→「ジョブ管理」→「ジョブネット設定」の順にクリックします。
../../../_images/sitemap_jobnet.png
「ジョブネット一覧」 から 「テナントマスタ」-「インポート」-「認可(リソースグループ)インポート」 を選択します。
画面下にある 「このジョブネットを編集する」 ボタンをクリックします。
「トリガ設定」 のプルダウンから 「繰り返し指定」 を選択して 「新規登録」 ボタンをクリックします。
「1回だけ実行する」 を選択状態にして 「決定」 ボタンをクリックします。
「有効」 のチェックボックスをクリックして、 「この内容でジョブネットを更新する」 ボタンをクリックします。
確認メッセージで 「決定」 ボタンをクリックします。
../../../_images/jobnet_settings_update.png
「ジョブネット一覧」 から 「テナントマスタ」-「インポート」-「認可(リソース)インポート」 を選択します。
同じ操作を行い、ジョブネットを更新します。
「サイトマップ」→「テナント管理」→「ジョブ管理」→「ジョブネットモニタ」の順にクリックします。
一覧に 「認可(リソースグループ)インポート」 「認可(リソース)インポート」 の2行が表示され、 「成功」 になっていることを確認します。
../../../_images/jobnet_monitor_search.png
これで認可に対して画面の表示に必要なリソースグループとリソースが登録できました。
次にステップ3 の操作を行います。

ステップ3:リソースに対して権限を設定する

「サイトマップ」→「テナント管理」→「認可」の順にクリックします。
認可設定画面が開きますので、画面左上の 「検索」 アイコンをクリックします。
「リソース(縦軸)の絞込」 のテキストボックスに 「Hello」 を入力して 「検索」 ボタンをクリックします。
../../../_images/authz_settings_search.png
リソース列の 「画面・処理」 の下に 「プログラミングガイドのサンプル」、さらにその下に 「Hello World」 が表示されていることが確認できます。
これでこのサンプル画面に対するリソースの登録が完了しました。
この状態で以下のURLへアクセスしてみます。
http://<HOST>:<PORT>/<CONTEXT_PATH>/sample/hello
HTTP 403 でアクセスできなくなったことが確認できました。
それでは最後にこの認可設定画面から、 「Hello World」 に対して認可設定を行います。
「サイトマップ」→「テナント管理」→「認可」の順にクリックします。
認可設定画面が開きますので、画面左上の 「検索」 アイコンをクリックします。
「リソース(縦軸)の絞込」 のテキストボックスに 「Hello」 を入力して 「検索」 ボタンをクリックします。
../../../_images/authz_settings_search.png
「権限設定を開始する」ボタンをクリックします。
「Hello World」 の行と 「テナント管理者」 の列が交わるセルをクリックして、緑色のチェックに変更します。
../../../_images/authz_settings_set_policy.png
この状態で、もう一度以下のURLへアクセスしてみます。
http://<HOST>:<PORT>/<CONTEXT_PATH>/sample/tgfw/hello
今度はアクセスできることが確認できました。
この場合、 「テナント管理者」 ロールを持つユーザのみがこのサンプル画面を表示できます。

コラム

このチュートリアルでは、下記のポイントを確認しました。

  • 画面へのアクセスを制御するために、認可を利用しました。
  • 画面の権限設定を認可で利用できるようにするために、認可と画面を紐づけるリソースとリソースグループを認可に登録しました。
  • 管理者が認可設定画面を開き、アクセスを制御したい画面のリソースに対して権限を設定しました。

メニュー設定と認可についての注意事項

作成した@RequestMappingメソッドをメニューに表示させるには、メニューアイテムとしてメニューに登録する必要があります。
メニュー登録の詳細については、「テナント管理者操作ガイド」の「メニューを設定する」を参照してください。
メニュー表示時に行う認可チェックでは、設定したメニューアイテムのURLのみが使用され、呼び出し方法や引数は使われません。
そのため、メニューアイテムのURLに対応させる@RequestMappingメソッドは、@RequestMappingのvalueのみを使用し、URLから一意に@RequestMappingメソッドが決定できるようにしてください。
ここでは、メニューの設定でURLと引数を使っているパターンを例に挙げ、URLのみに修正します。
  • 修正前
    メニューに引数を使っていて、@RequestMappingメソッドにparamsを使用して対応させています。
    メニュー表示時の解決にはURLのみが使用されるので、viewDog()でなく、view()の@Authzで認可チェックが行われてしまいます。
    メニューアイテムの設定内容
    URL pets
    引数 キー kind
    dog
    Controllerクラス
    @RequestMapping(value = "pets", params = "kind=dog")
    @Authz(uri = "service://pets/dog")
    public String viewDog() {
        return "dog.jsp";
    }
    
    @RequestMapping(value = "pets")
    @Authz(uri = "service://pets")
    public String view() {
        return "pets.jsp";
    }
    
  • 修正後
    URLと@RequestMappingのvalueのみでメニューと@RequestMappingメソッドを一意に対応できるように修正します。
    メニューアイテムの設定内容
    URL pets/dog
    引数 なし
    Controllerクラス
    // paramsを使わず、valueに含めるように修正します。valueの値は、valueだけで見て他の@ReuqestMappingと重複しないように決定します。
    @RequestMapping(value = "pets/dog")
    @Authz(uri = "service://pets/dog")
    public String viewDog() {
        return "dog.jsp";
    }
    
    @RequestMapping(value = "pets")
    @Authz(uri = "service://pets")
    public String view() {
        return "pets.jsp";
    }
    
また、メニュー表示時に行う認可チェックは常に GETリクエスト が利用されます。
そのため、該当するメソッドに@RequestMapping(method = RequestMethod.POST) のようにPOSTのみを指定している場合、認可チェックが正しく行えません。
  • 修正前
    @RequestMappingのmethodに POST のみを定義しています。
    メニュー表示時の認可チェックは常に GETリクエスト が利用されます。
    Controllerクラスには対応するメソッドがないため、認可チェックが正しく行えません。

    Controllerクラス
    @RequestMapping(method = RequestMethod.POST)
    @Authz(uri = "service://sample/foo")
    public String view() {
        return "view.jsp";
    }
    
  • 修正後
    @RequestMappingにはGETリクエストも含めるように修正します。
    ここではmethodを省略し、GET, POSTの両方を受け付けるようにしています。

    Controllerクラス
    @RequestMapping()
    @Authz(uri = "service://sample/foo")
    public String view() {
        return "view.jsp";
    }