erp fas design

15
プロジェクト22 Enterprise Resource Planning Package 財務会計システム 「TOMOCHANシステム設計 詳細設計 最終更新日:2004/06/09 改訂番号:1.21 初版:2004/05/12 NE14-0116B 荒浪一城 ( [email protected]) ライセンス WebサーバーApacheWebアプリケーションサーバーTomcatWebアプリケーシ ョンフレームワークStrutsStruts in Action におけるサンプルコード、Ja-Jakartaよる日本語訳はライセンス「Apache License Version 2.0」及び「The Apache Software License, Version 1.1」で配布されており、NOTICEファイルを含ませる、 またはエンドユーザー向けの文章で宣言などのライセンス条項に従うことで、無 償使用かつ再頒布可能な非独占的権利を無期限に許可される。これらのコードや 成果物をベースに目標とする各種機能を追加、実装するものとする。 検討:本プロジェクトにおけるライセンス Apache License, Version 2.0 Apache2, Tomcat5 http://www.apache.org/licenses/LICENSE-2.0 Open Source Initiative OSI承認ライセンス 日本語参考訳 Apache License, Version 2.0 http://opensource.jp/licenses/apache2.0.html The Apache Software License, Version 1.1 Struts, Struts in Action sample code, Ja-Jakarta http://www.apache.org/licenses/LICENSE-1.1 The Apache Software License, Version 1.1 (日本語非公式訳) http://www.jajakarta.org/site/legal.html 目標 Webアプリケーションを利用可能なユーザーを識別する 適切な権限(ロール)に従った業務を遂行が可能であること 要件 ユーザーは(ユーザー名とパスワード)を提示できる

Upload: kazuki-aranami

Post on 20-Jul-2015

26 views

Category:

Technology


2 download

TRANSCRIPT

プロジェクト22 Enterprise Resource Planning Package

財務会計システム 「TOMOCHAN」

システム設計 – 詳細設計

最終更新日:2004/06/09 改訂番号:1.21

初版:2004/05/12

NE14-0116B 荒浪一城 ([email protected])

● ライセンス

WebサーバーApache、WebアプリケーションサーバーTomcat、Webアプリケーシ

ョンフレームワークStruts、Struts in Action におけるサンプルコード、Ja-Jakartaに

よる日本語訳はライセンス「Apache License Version 2.0」及び「The Apache

Software License, Version 1.1」で配布されており、NOTICEファイルを含ませる、

またはエンドユーザー向けの文章で宣言などのライセンス条項に従うことで、無

償使用かつ再頒布可能な非独占的権利を無期限に許可される。これらのコードや

成果物をベースに目標とする各種機能を追加、実装するものとする。

検討:本プロジェクトにおけるライセンス

Apache License, Version 2.0 Apache2, Tomcat5 http://www.apache.org/licenses/LICENSE-2.0 Open Source Initiative OSI承認ライセンス 日本語参考訳 Apache License, Version 2.0 http://opensource.jp/licenses/apache2.0.html The Apache Software License, Version 1.1 Struts, Struts in Action sample code, Ja-Jakarta http://www.apache.org/licenses/LICENSE-1.1

The Apache Software License, Version 1.1(日本語非公式訳)

http://www.jajakarta.org/site/legal.html

● 目標

Webアプリケーションを利用可能なユーザーを識別する

適切な権限(ロール)に従った業務を遂行が可能であること

● 要件

ユーザーは(ユーザー名とパスワード)を提示できる

提示された情報が正規利用可能であるか検証する

有効でない情報が提示された場合これを拒否する

正規ユーザーに、ログイン情報を通知する

ロールに沿った業務が遂行可能であること

ロールに反した操作を拒否かつ無効にできる

いつでもログアウトできる

● 仕様

新規アクセス者に対して、「Welcome」画面を表示する

「Logon」画面において「ユーザー名」と「パスワード」を必須項目として入力

させる

受け入れ可能文字列は、半角英数字かつ、5文字以上20字以内

ユーザーからの入力値をビジネス層で検証する

ユーザー名と、同一のパスワードの設定を拒否する(JOEアカウントの禁止)

同一IDへのパスワード入力ミスは5回まで許容する(アカウントロック)

同一IPアドレスから1分以内の連続ログイン試行は5回まで許容する(ロックアウ

ト)

アカウントロックの時間は30分

セッションタイムアウトの時間は60分間(web.xmlへ記述)

<web-app> <session-config> <session-timeout>60</session-timeout> </session-config> </web-app>

ロールに基づくメニュー項目を「Welcome」画面にて表示しサービスを提供

ログイン、ログアウト共に「Welcome」画面より選択し、処理を行う

すべてのアクセスや動作のログを取得、60日以上保管する(ログイン、DB操作時

その後ログは別途メディアに移し変えるか、順次削除・破棄する

全般にHTTPS通信で行われるのが望ましい。(SSLExtension、SecurityFilter)

帳票印刷機能

インポート(設定ファイルのみ)、エクスポート(CSV、HTML、PDF、XMLなど

● Struts アーキテクチャ

● ストーリーボード(遷移図)

画面ごとの処理

○ index.jsp(論理名:なし)

welcomeへとforwardを行う

Jsessionidキーの付与

国際化(i18n)

検討:データベースの入力値、出力値部分の国際化)

プラグインによる初期化処理(トランザクショントークンの生成と付与)

検討:トランザクショントークンの生成と付与はlogon.jspで行うべきか?

○ welcome.jsp(論理名:welcome.do)

「Sign in」処理のためlogon.jspへ導く

「Sign out」処理後の表示画面

*事実上のトップページ

○ logon.jsp(論理名:logon.do)

ユーザー認証処理(アクションへの受け渡し)、menuへ

問題点:どのような方法でWebアプリケーション内部での、

ユーザーのアクセス権限の確保と制御を行うのか?

解決案:ロールベースセキュリティ

ユーザー認証において、サーブレットコンテナ(Tomcat)の機能を用いる方法であ

る。Webアプリケーションにおいて、 コンテナ管理によるセキュリティを利用する

レルム (ユーザー、パスワード、関連するロールのデータベース) を使用する。

何種類か手段が存在するが、その中でもリレーショナルデータベースに作成された

テーブルを参照し、ユーザー認証を行う「データソース(JDBC)レルム」がある

。これによりWebアプリケーションへのアクセス権限をロールにより設定・識別可

能となり、ユーザーのアクセス権限の変更にも迅速に対応することが出来る。

以下、Webアプリケーション全体のセキュリティ確保の手法

画面遷移及び制御に関するセキュリティ

トランザクショントークン、Struts Workflow Extension。どちらか一方で十分なのか

、併用すべきなのかは不明である。トランザクショントークンについては、次項を

参照。

Actionクラスのセキュリティ

ユーザーごとに、Actionクラスの実行権限を識別し適切にロールを判定する必要

がある。StrutsのAPIではクラス RequestProcessorの各種メソッドの利用が考えられる

。なお、Struts Workflow ExtensionでもActionクラスの実行権限を確認することが出

来る。

サーバーとクライアント間における通信路のセキュリティ

Struts SSL Extension

*参考文献*

= ロールベースセキュリティ =

Tomcat5ユーザガイド 6. レルムとアクセス制御

http://www.jajakarta.org/tomcat/tomcat5.0/ja/docs/tomcat-docs/realm-howto.html Role-based security http://www.husted.com/struts/resources/struts -security.htm Pow2ACL http://pow2acl.sourceforge.net/

「Sing out」処理(プラグインによる終了処理)、welcomeへフォーワード

認証ログの出力

● menu.jsp(論理名:menu.do)

データベースへの参照、入力

問題点:ユーザーによるリクエストの二重送信

解決案:Transaction(Synchronizer) Tokenによるリクエストの二重送信防止

引用元:日本IBMシステムズエンジニアリング

その他の参考:Strutsプログラミング講座 Lesson10 トランザクショントークン

*引用開始*

Strutsフレームワークでの実装例ActionクラスはHTTPセッションIDとタイムスタ

ンプで一意的なトークンを生成しセッション・オブジェクトに保管する。一方

Actionクラスはリクエストが来る度に上記の方法でトークンを生成しHTMLフォ

ームの隠しフィールドに保管。HTTPセッション・オブジェクトに保管されている

トークンとリクエスト・パラメーターにあるトークンの値を比較し二重送信有無

をチェックする。

Synchronizer Tokenでリクエストの二重送信防止

protected void saveToken(HttpServletRequest request){ HttpSession session = request.getSession(); String token = generateToken(request); if(token != null){ session.setAttribute(TRANSACTION_TOKEN_KEY,token); } }

トークンの生成HTMLフォーム中の隠しフィールド

<input type = "hidden"name ="org.apache.struts.taglib.html.TOKEN" value = "JSESSIONID">

*引用終了*

ただし、Strutsの持つこれらのトランザクショントークンを用いた一連の処理は複

数画面による操作には対応できない。複数画面に対応する必要性が生じた場合は

、野村総合研究所による「T-struts」(http://t-struts.sourceforge.jp/)を検討すべきであ

る。

データベース操作時のクラス設計

通常は複数のクラスに散在している処理を、1つのクラスにまとめるほうが保守性

の向上を見込める場合がある。1つのサービスに関する一連の処理を各々のAction

クラスへ分散するのではなく、同じActionクラスで持つべきとする考え方である

。Strutsでは、DispatchActionクラスがこの目的と合致する。

例えば、データベースでの操作は、一般的に閲覧・更新・削除というまとまった

処理である。このような処理は3つのクラスを設計する考え方も有効であるが、1

つのクラスにまとめた方が保守性の観点から良いと考えられる。

実装時には、DispatchActionクラスを継承し、それぞれのメソッドを定義するが、

StrutsのDispatchActionクラスは修正せず、独自のDispatchActionクラスを継承する

ことでStrutsのDispatchActionクラスをスーパークラスとして位置づけることが出

来る。

参考:プログラミング Jakarta Struts 122ページ

番号 Bean名

(論理名

実装

クラス

スコー

属性名 属性型 検証 初期化

1 logonForm Sample.forms.LogonFor

m Request Userid String

YES(半

角英数) reset

Password String

YES(

半角英

数)

reset

2

表A アクションフォームBean

番号 Bean名 実装

クラス

スコープ 属性名 属性型

1 userValueBean Sample.beans.UserInfoVB Session UserName String

Password String

Roles ArrayList

2

表B ValueObject一覧

操作ログの出力

システム上の深刻なエラーが発生 → erroe.jspへ遷移 → 管理者への連絡を促す

● error.jsp(論理名:なし)

システム上深刻なエラーであり、ユーザーへ管理者への連絡を促す

*参考*

プログラミング Jakarta Struts 78ページ

<web-app> <error-page> <exception-type>javax.servlet.ServletException</exception-type> <location>/some/where/error.jsp</location> </error-page> </web-app>

● 付録

Jsessionidキーについて

ハイパーリンクにセッションキーを含めることをURLリライティングと言う。クッ

キーが使用できなくとも、セッション管理を行える利点がある。Jsessionidキーはサ

ーブレットコンテナが管理し、クッキーが受け入れ可能であると、コンテナが自動

的にURLリライティングを省略する。Sun Microsystemsはセッション管理にクッキ

ーの利用を推奨しているが、本プロジェクトではクッキーを採用しない。

Strutsの国際化(i18n)について

ユーザーのローケルを取得、判別し国際化(i18n)をサポートする。国際化は最初

にサポートしておけば、後で追加する場合の作業量を比較すると極めて低く抑える

ことができる。

struts-config.xml の <struts-config> 内で、

<!-- ================================ Message Resources Definitions -->

<message-resources parameter="resources.application"/>

と指定する。

そもそも Struts は properties 拡張子以外は読み込んでくれない。設定ファイルで

resources.application と指定してあるならば、application.properties の名称でファイル

を作成、保存しなければならない。

なお、それぞれの言語ごとにファイルを作成する。日本語であれば、

application_ja.properties となる。言語部分に相当する ja は国際規格 ISO-3166 に準じ

て記述する。これらの判別は、HTTPリクエスト内に含まれる Accept-Language ヘッ

ダーに基づく。

例: 英語 en 中国語 zh

properties ファイルは

%TOMCAT_HOME%\webapps\%APP_NAME%\WEB-INF\classes\resources\

に保存しなければならない。

message-resources に記述した内容と一致する必要がある。つまり、

resources.application と指定したからには、 resources フォルダ下に、application とい

うファイル名で properties ファイルを作成する必要がある。

国際化を行う該当JSPファイルには、 <html:html locale="true"> を記述し、また、

<bean:message key="welcome.title"/> のように key も記述する。該当する Tag Library

の記述子が web.xml に存在するか確認することを推奨する。

properties ファイルにて、 key=welcome.title と指定されていれば、

welcome.title=ようこそ!

のように記述する。

# Struts in Action では、 application_ja_JP.properties と

# 国( ISO-639 )を含めるファイル名となっている。

フォーワードとリダイレクトについて

Strutsフレームワークでは、画面遷移にリダイレクトとフォーワードの2種類が存在

するが、一般的にフォーワードがクライアントへ依存せず推奨される。フォーワー

ド時にはブラウザが関与しない等の利点がある。一方で、JSPにはイメージやなど

のリソースが相対パスで指定されている場合、相対パスは最初のサーブレットを基

準にしていることに留意する必要がある。

<html:base/>を指定することで、HTMLのbaseタグを生成するため相対パスが利用可

能となる。

トップページの指定は、web.xmlにて次のように記述し指定する。

<!-- The Usual Welcome File List --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list>

struts-config.xmlにおけるForwardActionについて

<!-- =================================== Action Mapping Definitions -->

<action-mappings> <action

path="/Welcome" type="org.apache.struts.actions.ForwardAction"

parameter="/pages/Welcome.jsp"/>

この記述により、http://localhost:8080/logon/pages/Welcome.jspではなくブラウザには

http://localhost:8080/logon/Welcome.doと表示される。「*.do」拡張子はコントローラーに

より管理されることを意味しており、全般的にそのようなページにアクセスさせ る

設計が望ましいとされる。

図 struts-blankアプリケーション(URLは架空)。実態はlogon.jsp

Struts SSL ExtensionによるHTTPS通信

<html:form method="post" action="/logonSubmit"> <sslext:form method="post" action="/logonSubmit">

Apache + Tomcat SSL設定

SSLを使用可能な状態にする。

ApacheとTomcatが連携されている場合には、Tomcatのsever.xmlでコメントアウトさ

れている<!-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 -->以下を有効にす

る。その後、Tomcat、Apacheを再起動する。

Tomcat5 サーブレット/JSP コンテナ SSL設定の手引き

http://www.jajakarta.org/tomcat/tomcat5.0/ja/docs/tomcat-docs/ssl-howto.html

ログインについて

logon.jspよりユーザー名とパスワードがHTTPリクエスト(POST)で送信される。

コントローラーが提供するActionForm(JavaBeans)が取得、データバッファ、検証

、型変換などの役割を受け持つ。ActionFormは値を受け取った後に、Validatorメソ

ッドなどで検証(サニタイズ)、ユーザーデータベースと照合を行い、パスすれば

値をJavaBeansのプロパティへと格納する。StrutsのActionFormにあるvalidate()メソッ

ドを拡張したCommons Validatorなどを用いて、JavaScriptを用いてクライアント側で

検証を行う。クライアント側ではJavaScriptを解除することも可能であるが、二重に

チェックすることに意味がある。

ActionFormは、String型とboolean型のプロパティのみを使用することができるため

、適切な型変換が必要となる。ヘルパーメソッドの作成など。

JavaBeansプロパティの作成には、通常フィールド、ゲッター、セッターが必要とな

る。これらの作業は大規模アプリケーションになるほど作業量が増えます。

ActionFormをDynaActionFormに置き換えることで、これらをJavaBeansプロパティ宣

言のみにすることが可能です。しかし、struts-config.xmlに記述する必要性があるこ

とから、EclipseなどのIDE支援機能を用いれば素直にActionFormを用いるほうが得

策と言える。

データベース参照

メニューから作業(仕訳帳記入など)を選択し、該当するデータをテーブルから呼

び出すし、データベースへの操作を行う。この際、各々のユーザーにおけるアクセ

ス権限に沿った作業しか行うことができない。

経営者は部門ごとの集計と、財務諸表を閲覧することができる。

オブジェクト指向と反する面が多い、データベースへのアクセスをどのようにする

かということについて専門家においても様々な議論が展開されている。傾向として

、およそ3つの大きな選択肢がある。JDBC、Commons DBCP + DBUtils、O/Rマッピ

ングツール(Torque、Hibernate)である。

次世代のEJB3.0では、JBoss、Hibernateからの提案を多く受け入れている。また、

HibernateはJBossの傘下となったことからも、O/Rマッピングツールを用いる場合は

Hibernateがトレンドとなる可能性がある。しかしこれらO/Rマッピングツールは、

同時にAntやXDocletなどの知識などが前提知識としてある程度必要となる。

データベース入力

データベースとしてMySQLを用いる。

所属部門のデータに関しては閲覧のみができる。(ユーザーテーブルに所属)

所属部門以外のデータは見ることができない。

ユーザーは独自の勘定科目を定義することができる。

ユーザー自身の入力した項目は、いつでも追加・編集・削除を行うことができる。

ユーザーの入力を支援するため、よくある売り上げデータを自動で仕分けする。

勘定科目の設定が難しいことから、専用のヘルプ機能を作る。

MySQLにおけるトランザクションサポートについて

MySQLではトランザクションがサポートされているが、デフォルトで作成されるテ

ーブルの形式(MyISAM)では更新時のロックがテーブル全体に及ぶというという

デメリットがある。

トランザクションをサポートするテーブル形式(InnoDB)を用いることができる。

この形式では、SQL1つ1つにトランザクション処理がなされるため、MyISAMと比

較して更新系のパフォーマンスが落ちるという問題がある。しかしながら、それで

も十分なパフォーマンスが確保されており、データベースの更新が頻繁に発生しト

ランザクション処理による整合性を保つ必要がある本プロジェクトにおいては、行

レベルまでロックが可能なInnoDBテーブルが必要となる。

MySQL Manual | 7.5 InnoDB テーブル

http://dev.mysql.com/doc/mysql/ja/InnoDB.html

ログアウトについて

ログイン後はいつでもログアウトできるが、確定処理(コミット)を行っていない

編集中のデータ(トランザクション)は当然破棄される。ログアウトボタンを押し

た際に、確認ダイアログを表示する。ログアウト処理(セッション情報の破棄)に

成功すれば、その旨を「ログアウト完了」を画面に表示する。この際、ユーザーの

地域化情報(ローケル)も破棄されるため、「Welcome」画面へと遷移させる。

// ユーザーのログイン情報を削除する

Session.removeAttribute(Constants.User_KEY);

// 終了処理

// 制御をActionForwardのSUCCESSへと移す。

Return(mapping.findForward(Constants.SUCCESS));

● 参考文献

STRUTS・イン・アクション

テッド・ハスティッド (著)

価格: ¥5,040 (税込)

出版社: ソフトバンクパブリッシング ; ISBN: 4797323442 ; (2003/12/10)

プログラミングJakarta Struts

Chuck Cavaness (著), 長瀬 嘉秀 (翻訳)

価格: ¥4,620 (税込)

出版社: オライリー・ジャパン ; ISBN: 4873111358 ; (2003/06/24)

Jakartaプロジェクト カンタンStruts1.1

―オープンソースフレームワークStrutsによるWebアプリケーション開発

石井 真 (著), 阿島 哲夫 (著), カサレアル (著)

価格: ¥2,205 (税込)

出版社: 秀和システム ; ISBN: 4798006041 ; 改訂版 版 (2003/08)

Strutsプログラミング講座

宇野 るいも (著), arton (著)

価格: ¥3,780 (税込)

出版社: アスキー ; ISBN: 4756143075 ; (2003/06)

Jakartaプロジェクト徹底攻略2 ~本格活用編~ Javaエキスパートシリーズ

WEB+DB PRESS編集部編 (著)

価格: ¥1,974 (税込)

出版社: 技術評論社 ; ISBN: 4774119458 ; 2 巻 (2004/02/10)

以上