カスタムラベルライブラリとプロファイルでJSPページ要素へのアクセス制御を実現します。


クライアントアクセスを制御することは、B/Sベースのアーキテクチャを開発するシステムの開発者が考えるべき問題である。JSPまたはSERVLET仕様のプロファイルベースのセキュリティポリシーによるリソースの制御は、ファイル単位、すなわち、あるビューだけを定義することができます。すべて、またはすべてアクセスできません。比較的複雑なシステムは往々にして、ビューの一部(JSPページのボタンのような)にアクセス制御を提供し、ある役割のユーザーにのみアクセスできるようにする必要がある。プログラム可能なセキュリティポリシーを採用すれば、ユーザーの役割と操作の定義が開発時に定義されないため、このような策略はプログラマの仕事量を増やします。いい方法ではないかもしれません。       私はカスタマイズラベルライブラリと配置ファイルを使ってこの問題を解決します。保護された内容のために一意の名前を付けて、この名前をラベルの属性とします。あるキャラクターは、ページ要素またはページ要素のセットに対して権限があるかどうか、XMLプロファイルで説明します。        例えば、以下のJSPページには「詳細」と「修正」の二つのボタンがあります。taglib uri="http://mytag「prefix=」custTag「%」test
form 1">   <テーブルwidth="600"border="0"celspacing="0"cell padding="2"                                                  
        以下のXML設定ファイルの内容は、キャラクターがcomonであるユーザーに対して、employeedetailというページ要素である「詳細」ボタンに権限があり、キャラクターが「admin」であるユーザーに対して、employeedletailとemployeemoodifyというページ要素である2つのボタンに権限があります。xml version=「1.0」encoding=「GB 2312」?security<roleName name="admin/httlemtmlement"<Etmlement>Etmlement>        カスタムラベル類JspSecurityTagは、BodyTagSupport類を継承しています。BodyTagSupportにはスタートマークと終了フラグの間にある変数があります。JspSecurityTagのプライベート静的変数roleListは、XMLファイルからキャラクターとページ要素の対応する集合を取得し、プライベート変数ElementNameはページ要素の名称に対応しています。このカスタマイズラベルを解析するときは、まずページ要素の名前を取って、現在のユーザーの役割を取ります。キャラクターにページ要素の権限があれば、ラベル本文(つまりページ要素)が表示されます。そうでなければ表示されません。 Pagekage comp.presentation.viewhelper.JspSecurityTag; import javax.servlet.jsp.tagext.*;import javax.servlet.jsp.*;import java.util.*;import org.xml.sax.*;import org.xml.sax.helpers.*;import org.w 3 c.dom.*;import java.io.*;import javax.xml.parsers.*; public class JspSecurityTag extends Body TagSupport{  //XMLファイルからキャラクターとページ要素の対応するセットを保存します。  prvate static ArayList roleList;  //ページ要素の名前  prvate String element Name;   public void setElement Name(String str)  {    this.element Name=str;  }   public int doAfterBody()throws JspException{    if(roleList==null)    {      roleList=get List()    }    try{        //認証が通ると、ラベル本文が表示されます。そうでなければ、ラベル本文をスキップするのは簡単です。        if(isAuthentificated(element Name)        {          if(bodyContent!=null){            JspWriter out=bodyConttent.get EncocosingWriter();            bodyConttent.writeOut(out);          }else          {          }        }    }catch(Exception e){      throw new JspException()    }    return SKIP_BODY;  }  //XMLプロファイルからキャラクターとページ要素の対応を取って、静的なArayListに保存します。  prvate ArayList get List()  {    DcumentBuider Factory dbf=        DcumentBuider Factory.newInstance()    DcumentBulder db=null;    Dcument doc=null    NodeList childlist=null;    String element Name;    String roleName;    int index    ArayList the List=new ArayList()     try{      db=dbf.newDockMentBuider()    }catch(Exception e)    {      e.print StockTrace();    }    try{      doc=db.parse(new File);    }catch(Exception e)    {      e.print StockTrace();    }    //ページ要素リストを読みだします。    NodeList element List=doc.getElements ByTagName(「htmlElement」)    for(int i=0;i<element List.get Length();i++)    {      Element name=((Element)element List.item(i);      //ページ要素の名前      element Name=name.getAttribute(“name”);      //このページ要素に対応する権限のあるキャラクターのリスト      NodeList rol NodeList=(NodeList)name.get Elements ByTagName);      for(int j=0j    http://mytag           /WEB-INF/mystag.tld      3、TLDファイルはtaglib元素を使用して各カスタマイズラベルの極めて属性を識別しなければなりません。以下はこのタブライブラリを使って対応するTLDファイルです。xml version=「1.0」encoding=「ISO-859-1」?DOCTYPE taglib PUBLIC"-/Sun Microsoft tems,Inc./DMD JSP Tag Library 1.1/EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd'  1.0  1.1  myTag    <タグ    JspSecurity    comp.presentation.viewhelper.JspSecurityTag           JspSecurityTag               elementName       true       true