- PR -

画面遷移とアクセス制御の方法

1
投稿者投稿内容
POTETO
常連さん
会議室デビュー日: 2003/10/06
投稿数: 41
投稿日時: 2004-01-03 01:02
こんばんは、POTETOです。
フレームワークとしてStruts1.1を利用しています。

URLの直接入力を許さない処理の記述方法について質問です。
ありうる画面遷移をXMLファイルなどに設定しておき、
画面表示のJSP(HTML)にHIDDENで画面IDを持たせて、
RequestProcessor#processPreprocess()かRequestProcessor#processRoles()を
拡張して、セッションに保存した画面IDとrequestのURL(Actionパス)を
XMLに設定した定義と比較して正規の画面遷移か不正な画面遷移かを
判断しようかと思っています。

これだとアクションが増える度にXMLを修正する必要があります。
皆さんは、画面遷移制御(アクセス制御)をどのように行っていますか?

ご教授の程宜しくお願い致します。
Clap
常連さん
会議室デビュー日: 2003/02/14
投稿数: 20
投稿日時: 2004-01-03 09:46
URLの直接入力を防ぐならTransactionToken機能を使用すれば十分ふせげるかと思います。
すべてのActionの共通処理としてTokenチェックをすればいいと思います。
(ActionServletのprocessPreprocessでもよいのかもしれませんが。)

的はずしてます?
Emacs信者
常連さん
会議室デビュー日: 2003/08/10
投稿数: 38
投稿日時: 2004-01-03 23:20
僕は、画面遷移の制御などの情報はstruts-configで一元管理するべきだと考えています。
なので、org.apache.struts.action.ActionMappingを拡張したカスタムクラスを
使用することで、struts-configのaction要素内に直接書き込めるようにしています。

コード:

class CustomActionMapping extends ActionMapping{
private String validPaths;

public void setValidPaths(String s){validPaths=s;}
public String getValidPaths(){return validPaths;}
}


コード:

<action
path="/input"
type="sample.InputAction"
name="InputForm"
className="sample.CustomActionMapping">

<!-- 独自拡張部分 -->
<set-property property="validPaths" value="/hoge,/moge"/>

<forward name="success" path="/ok.vm"/>
<forward name="path_error" path="/error.vm"/>
</action>



このようにした上で、共通のActionクラスを作り、そこでパスの検証を行なっています。
その部分は、以下のようにすれば良いと思います。
コード:

abstract class AbstractAction extends Action{
public final ActionForward execute(
ActionMapping actionMapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)throws IOException,ServletException{

final CustomActionMapping cam=(CustomActionMapping)actionMapping;

//"path"は、hiddenで送られてくるパス情報とする。
//なお、この辺はいいかげんなコードので、ホントはもっとちゃんと書く必要あり
if(cam.getValidPaths().indexOf(request.getParameter("path"))<0)
return actionMapping.findFoward("path_error");

return executeImpl(actionMapping,form,request,response);
}

protected abstract ActionForward executeImpl(
ActionMapping actionMapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)throws IOException,ServletException;
}



こんな感じでどうでしょうか?

[ メッセージ編集済み 編集者: Emacs信者 編集日時 2004-01-03 23:25 ]
POTETO
常連さん
会議室デビュー日: 2003/10/06
投稿数: 41
投稿日時: 2004-01-05 19:41
Clapさん、Emacs信者さん
返信ありがとうございます。

確かにTransactionTokenは2重submitも回避できて良いのですが、
2重submit時に、いきなりエラーページへ遷移し、
1回目のsubmitが正常に終了しているのかどうかが分からないので
使うのを止めていました。
また、ActionMappingの拡張は思いつきませんでした。
いろいろ方法があると勉強になりました。
1

スキルアップ/キャリアアップ(JOB@IT)