intra-mart Accel Platform IM-Workflow プログラミングガイド 第26版 2023-10-01

9.8.3. 対応方法


対応方法としては、以下のいずれかを選択可能です。
  1. 認可設定
  2. ユーザコンテンツ画面の追加開発(カスタマイズ)
どちらの方法を選択すべきかは、下表を参照してください。
要件 推奨する対応方法
ユーザコンテンツ画面の実装を改修できない 認可設定
アクセス権設定を認可機構で統一的に扱いたい 認可設定
IM-Workflowの標準機能と同等のユーザコンテンツ画面表示権限判定を実行したい ユーザコンテンツ画面の追加開発(カスタマイズ)
以降では、それぞれの対応方法の詳細について説明します。
運用形態や影響範囲を考慮の上、適当な方法を選択してください。

9.8.3.1. 認可設定

認可機構により、ユーザコンテンツ画面を「リソース」として登録し、アクセス権設定を行います。
認可の仕様については「 認可仕様書 」を参照してください。
認可設定による対応の特徴は以下の通りです。
  • ユーザの権限を認可機構で集約して管理することが可能です。

  • ユーザコンテンツ画面の実装の改修は不要です。

  • IM-Workflow のルート定義で設定される処理対象者を包含する範囲で認可設定を行う必要があります。

    • 例として、同一の申請用ユーザコンテンツ画面を、フローAとフローBで流用している場面を想定します。
      • フローAはルートAを利用しており、申請ノードの処理対象者は「サンプル課11」です。
      • フローBはルートBを利用しており、申請ノードの処理対象者は「サンプル部門02」です。
    • この場合、申請用ユーザコンテンツ画面の認可設定としては、「サンプル課11」と「サンプル部門02」からの実行を許可する設定を行う必要があります。

以降では、 IM-Workflow のコンテンツ定義における「パス種別」ごとに、認可設定を行う際の参考となるドキュメントを紹介します。

9.8.3.1.1. パス種別「JavaEE開発モデル」の場合

移行ガイド 」 の「 im-JavaEE Framework 」の認可設定部分を参照してください。

9.8.3.1.2. パス種別「URL」(旧名称:JSP or Servlet)の場合

TERASOLUNA Server Framework for Java (5.x) を利用して実装している場合、「 TERASOLUNA Server Framework for Java (5.x) プログラミングガイド 」の 「 認可 」を参照してください。

9.8.3.2. ユーザコンテンツ画面の追加開発(カスタマイズ)

IM-Workflow が提供するタグライブラリ、またはAPIを利用し、ユーザコンテンツ画面の表示権限を判定します。
ユーザコンテンツ画面の表示権限とは、特定の案件を処理、または参照する場合に利用されるユーザコンテンツ画面を、IM-Workflow 標準の各種一覧画面(フロー一覧、未処理一覧など)から表示することのできる権限のことを指します。
ユーザコンテンツ画面の追加開発による対応の特徴は以下の通りです。
  • IM-Workflow の標準機能と同等のユーザコンテンツ表示権限判定を行うことが可能です。
  • ユーザコンテンツ画面の実装の改修が必要です。
対応方法としては、以下のいずれかを選択可能です。
  • タグライブラリによる対応
  • APIによる対応

9.8.3.2.1. タグライブラリによる対応

クライアントタイプ別で、ユーザコンテンツ画面の表示権限判定用タグライブラリが用意されています。
  • クライアントタイプ=PC

    • 「workflowUserContentsAuth」
  • クライアントタイプ=スマートフォン

    • 「spWorkflowUserContentsAuth」
ユーザコンテンツ画面で上記のタグライブラリを利用するのみで、ユーザコンテンツ画面の表示権限の判定を行うことが可能です。
表示権限がない場合、HTTP 403エラーが発生します。
タグライブラリによる対応を行う場合は、「 APIドキュメント 」を併せて参照してください。

9.8.3.2.1.1. 推奨実装

以下のルールで実装を行うことを推奨します。
  1. ユーザコンテンツ画面に「リクエストパラメータ 」として受け渡されたパラメータを、すべてリクエストスコープの属性として格納します。

  2. タグライブラリを引数省略の形式で利用します。


    ユーザコンテンツ画面が複数画面構成の場合、追加で下記実装を行うことを推奨します。
  3. リクエストパラメータ 」としてユーザコンテンツ画面に受け渡されたパラメータを、ユーザコンテンツ画面間を遷移する際に引き回します。そのうえで、上記の1、2の実装を各ユーザコンテンツ画面で行います。

上記のルールを採用することにより、以下の実装上のメリットがあります。
  • タグライブラリを統一的な手法で組み込むことが可能です。
  • ひとつのユーザコンテンツ画面が複数の画面種別に対応した実装となっている場合でも、画面種別の差異によってタグライブラリに指定するパラメータを切り替える必要がなくなります。

9.8.3.2.1.2. 実装例

IM-Workflow JavaEE開発モデルの下記サンプルをもとに、推奨実装例1、2を紹介します。
  • クライアントタイプ=PCの場合

    • アプリケーションID : imw_sample_purchase
    • サービスID : apply
  • クライアントタイプ=スマートフォンの場合

    • アプリケーションID : imw_sp_sample_purchase
    • サービスID : apply
このサンプルでは、以下の画面種別に対応しています。
  • 申請画面
  • 一時保存画面
  • 申請(起票案件)画面
  • 再申請画面
それでは、順を追って実装例を示します。
  1. ユーザコンテンツ画面に「リクエストパラメータ 」として受け渡されたパラメータを、すべてリクエストスコープの属性として格納します。

    HttpServletRequest#setAttribute(String, String) を利用し、リクエストスコープの属性にパラメータを格納します。
    ※サンプルではあらかじめ実装されています。
    <%サンプルプログラムディレクトリ%
       /jp/co/intra_mart/sample/workflow/purchase/controller/service/ApplyServiceTransition.java>
    
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    package jp.co.intra_mart.sample.workflow.purchase.controller.service;
    
    import javax.servlet.http.HttpServletRequest;
    
    import jp.co.intra_mart.framework.base.service.DefaultTransition;
    import jp.co.intra_mart.framework.base.service.ServicePropertyException;
    import jp.co.intra_mart.framework.base.service.TransitionException;
    
    public class ApplyServiceTransition extends DefaultTransition {
    
        @Override
        public String getNextPage() throws ServicePropertyException, TransitionException {
            final ApplyServiceResult serviceResult = (ApplyServiceResult) getResult();
            return getNextPagePath(serviceResult.getNextPageServiceId());
        }
    
        @Override
        public void setInformation() throws TransitionException {
            final HttpServletRequest request = getRequest();
            final ApplyServiceResult serviceResult = (ApplyServiceResult) getResult();
            // 受け渡されたパラメータをリクエストスコープに設定します。
            request.setAttribute("imwGroupId", serviceResult.getImwGroupId());
            request.setAttribute("imwUserCode", serviceResult.getImwUserCode());
            request.setAttribute("imwPageType", serviceResult.getImwPageType());
            request.setAttribute("imwUserDataId", serviceResult.getImwUserDataId());
            request.setAttribute("imwSystemMatterId", serviceResult.getImwSystemMatterId());
            request.setAttribute("imwNodeId", serviceResult.getImwNodeId());
            request.setAttribute("imwArriveType", serviceResult.getImwArriveType());
            request.setAttribute("imwAuthUserCode", serviceResult.getImwAuthUserCode());
            request.setAttribute("imwApplyBaseDate", serviceResult.getImwApplyBaseDate());
            request.setAttribute("imwContentsId", serviceResult.getImwContentsId());
            request.setAttribute("imwContentsVersionId", serviceResult.getImwContentsVersionId());
            request.setAttribute("imwRouteId", serviceResult.getImwRouteId());
            request.setAttribute("imwRouteVersionId", serviceResult.getImwRouteVersionId());
            request.setAttribute("imwFlowId", serviceResult.getImwFlowId());
            request.setAttribute("imwFlowVersionId", serviceResult.getImwFlowVersionId());
            request.setAttribute("imwCallOriginalParams", serviceResult.getImwCallOriginalParams());
            request.setAttribute("imwCallOriginalPagePath", serviceResult.getImwCallOriginalPagePath());
            
            request.setAttribute("item_name", serviceResult.getItemName());
            request.setAttribute("item_amount", serviceResult.getItemAmount());
            request.setAttribute("item_price", serviceResult.getItemPrice());
            request.setAttribute("item_total", serviceResult.getItemTotal());
            request.setAttribute("item_comment", serviceResult.getItemComment());
        }
    }
    
  2. タグライブラリを引数省略の形式で利用します

    タグライブラリを画面実装に追加します。
    • クライアントタイプ=PCの場合
    <(展開したwar)/sample/im_workflow/purchase/apply.jsp>
    
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    <%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
    <%@ taglib prefix="imartj2ee" uri="http://www.intra-mart.co.jp/taglib/core/framework" %>
    <%@ taglib prefix="imui" uri="http://www.intra-mart.co.jp/taglib/imui" %>
    <%@ taglib prefix="imart" uri="http://www.intra-mart.co.jp/taglib/core/standard" %>
    <%@ taglib prefix="workflow" uri="http://www.intra-mart.co.jp/taglib/imw/workflow" %>
    <imartj2ee:HelperBean id="bean" class="jp.co.intra_mart.sample.workflow.purchase.controller.view.CommonHelperBean"/>
    
    <!-- タグライブラリ(引数省略) -->
    <workflow:workflowUserContentsAuth />
    
    <imui:head>
    .
    .
    .
    
    • クライアントタイプ=スマートフォンの場合
    <(展開したwar)/sample/im_workflow_smartphone/purchase/apply.jsp>
    
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    <%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
    <%@ taglib prefix="imartj2ee" uri="http://www.intra-mart.co.jp/taglib/core/framework" %>
    <%@ taglib prefix="imui" uri="http://www.intra-mart.co.jp/taglib/imui" %>
    <%@ taglib prefix="imart" uri="http://www.intra-mart.co.jp/taglib/core/standard" %>
    <%@ taglib prefix="workflow" uri="http://www.intra-mart.co.jp/taglib/imw/workflow-smartphone" %>
    <imartj2ee:HelperBean id="bean" class="jp.co.intra_mart.sample.workflow.purchase.controller.view.CommonHelperBean"/>
    
    <!-- タグライブラリ(引数省略) -->
    <workflow:spWorkflowUserContentsAuth />
    
    <imui:head>
    

9.8.3.2.2. APIによる対応

タグライブラリによる対応では実現できない要件がある場合は、ユーザコンテンツ画面の表示権限の判定APIを利用することで、任意の動作をさせることが可能です。
具体的には、次のような場合を想定します。
  • 業務ロジックのとの兼ね合いで、タグライブラリを利用できない場合
  • 表示権限がないと判定された際、HTTP 403エラーではなく任意の処理を行いたい場合
対応するAPIは「jp.co.intra_mart.foundation.workflow.util.auth.WorkflowAuthUtil」です。
権限判定の結果は boolean 値で返却されるため、結果をうけて任意の処理を行うことが可能です。
詳細は「 APIドキュメント 」を参照してください。