認可¶
項目
画面にアクセス権限を設定するために¶
@RequestMapping() public String index() { return "index.jsp"; }Controllerクラスの設定により画面へのアクセスが可能になりました。しかし、このままでは@RequestMappingメソッドの処理が行われる際に認可処理が省略されるため、誰でも画面を表示できます。実際にシステムを運用する際は、アクセス権限を設定して特定のユーザのみに画面を表示させ、アクセスの制限をかける場合がほとんどです。この章では、 intra-mart Accel Platform で用意されている認可機能を利用して、用意した画面を特定のユーザにのみ表示させる手順を説明します。Controllerクラス、@RequestMappingメソッドの詳細については 「Annotated Controllers」 を参照してください。
画面へアクセスするための認可設定方法¶
ステップ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:認可のリソースグループ、リソースを登録する¶
サンプルで作成した画面と認可を紐づけるため、認可に対して以下の構成でリソースグループとリソースを登録します。リソースグループとリソースは 「認可設定画面から登録する方法」 と 「ジョブを利用してファイルから登録する方法」 があります。認可設定画面からリソースを登録する場合は、 ステップ2-1:認可設定画面を利用して認可のリソースグループ、リソースを登録する の操作を行ってください。ジョブを利用してファイルから登録するリソースを登録する場合は、 ステップ2-2:ジョブを利用して認可のリソースグループ、リソースを登録する の操作を行ってください。
ステップ2-1:認可設定画面を利用して認可のリソースグループ、リソースを登録する¶
テナント管理者で intra-mart Accel Platform にログインします。http://<HOST>:<PORT>/<CONTEXT_PATH>/login「サイトマップ」→「テナント管理」→「認可」の順にクリックします。認可設定画面が開きますので、 「権限設定を開始する」ボタンをクリックします。まずはリソースグループを登録します。リソース列の 「画面・処理」 にマウスカーソルを合わせると右側にアイコンが表示されますので、アイコンをクリックします。「リソースの詳細」 ダイアログの 「配下にリソースを新規作成」 をクリックします。「リソースグループID」 のテキストボックスに 「guide-sample-service」 を入力します。「リソースグループ名」 の最も上のテキストボックスに 「プログラミングガイドのサンプル」 を入力します。「リソースURI」 と 「説明」 は未入力のままでかまいません。「OK」 ボタンをクリックします。 これでリソースグループが登録されました。コラム
「リソースグループID」 には任意の ID を指定できます。「リソースURI」 を未入力状態にして登録することで、リソースをグループ化するためのリソースグループを作成できます。実際の開発時は、認可管理者に対して登録したリソースグループがどの画面・処理・データを表しているか明示するために、「説明」 を設定することをお勧めします。「リソースの詳細」 ダイアログの 「リソースの階層」 から、作成した 「プログラミングガイドのサンプル」 を探します。同じ行の右側にある 「開く」 アイコンをクリックします。「プログラミングガイドのサンプル」 が選択されます。注意
リソースグループの配下にリソースが登録されていない場合、権限設定のグリッド上には表示されません。「リソースの階層」 には表示されます。コラム
「リソースの階層」 には選択されているリソース(グループ)の親階層と、子階層(1 階層)が表示されます。次にリソースを登録します。「リソースの詳細」 ダイアログの 「配下にリソースを新規作成」 をクリックします。「リソースグループID」 のテキストボックスに 「guide-sample-foo-service」 を入力します。「リソースグループ名」 の最も上のテキストボックスに 「Hello World」 を入力します。「リソースURI」 のテキストボックスに 「service://sample/foo」 を入力します。「説明」 は未入力のままでかまいません。「OK」 ボタンをクリックします。 これでリソースが登録されました。コラム
「リソースグループ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「サイトマップ」→「テナント管理」→「ジョブ管理」→「ジョブネット設定」の順にクリックします。「ジョブネット一覧」 から 「テナントマスタ」-「インポート」-「認可(リソースグループ)インポート」 を選択します。画面下にある 「このジョブネットを編集する」 ボタンをクリックします。「トリガ設定」 のプルダウンから 「繰り返し指定」 を選択して 「新規登録」 ボタンをクリックします。「1回だけ実行する」 を選択状態にして 「決定」 ボタンをクリックします。「有効」 のチェックボックスをクリックして、 「この内容でジョブネットを更新する」 ボタンをクリックします。確認メッセージで 「決定」 ボタンをクリックします。「ジョブネット一覧」 から 「テナントマスタ」-「インポート」-「認可(リソース)インポート」 を選択します。同じ操作を行い、ジョブネットを更新します。「サイトマップ」→「テナント管理」→「ジョブ管理」→「ジョブネットモニタ」の順にクリックします。一覧に 「認可(リソースグループ)インポート」 「認可(リソース)インポート」 の2行が表示され、 「成功」 になっていることを確認します。これで認可に対して画面の表示に必要なリソースグループとリソースが登録できました。次にステップ3 の操作を行います。
ステップ3:リソースに対して権限を設定する¶
「サイトマップ」→「テナント管理」→「認可」の順にクリックします。認可設定画面が開きますので、画面左上の 「検索」 アイコンをクリックします。「リソース(縦軸)の絞込」 のテキストボックスに 「Hello」 を入力して 「検索」 ボタンをクリックします。リソース列の 「画面・処理」 の下に 「プログラミングガイドのサンプル」、さらにその下に 「Hello World」 が表示されていることが確認できます。これでこのサンプル画面に対するリソースの登録が完了しました。この状態で以下のURLへアクセスしてみます。http://<HOST>:<PORT>/<CONTEXT_PATH>/sample/helloHTTP 403 でアクセスできなくなったことが確認できました。それでは最後にこの認可設定画面から、 「Hello World」 に対して認可設定を行います。「サイトマップ」→「テナント管理」→「認可」の順にクリックします。認可設定画面が開きますので、画面左上の 「検索」 アイコンをクリックします。「リソース(縦軸)の絞込」 のテキストボックスに 「Hello」 を入力して 「検索」 ボタンをクリックします。「権限設定を開始する」ボタンをクリックします。「Hello World」 の行と 「テナント管理者」 の列が交わるセルをクリックして、緑色のチェックに変更します。この状態で、もう一度以下の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"; }