Dict.CN 在線詞典, 英語學習, 在線翻譯

          都市淘沙者

          荔枝FM Everyone can be host

          統計

          留言簿(23)

          積分與排名

          優秀學習網站

          友情連接

          閱讀排行榜

          評論排行榜

          用定制標簽庫和配置文件實現對JSP頁面元素的訪問控制

          控制客戶端訪問是開發一個基于B/S的架構的系統的開發者必須考慮的問題。JSP或SERVLET規范的基于配置文件的安全策略對資源的控制是以文件為單位的,即只可以定義某個視圖全部可以或全部不能被訪問。一個比較復雜的系統往往要要求對視圖的一部分(如JSP頁面里的一個按鈕)提供訪問控制,只允許被某種角色的用戶訪問。如果采用可編程的安全策略,因為對用戶角色和操作的定義在開發時不能定義,而且這種策略加大了程序員的工作量,它可能不是一種好的辦法。

          ?????? 我采用定制標簽庫和和配置文件來解決這個問題:把要權限控制的JSP頁面元素如BUTTON,作為標簽的內容。為受保護的內容起一個唯一的名稱,把這個名稱作為標簽的一個屬性。某個角色對某個頁面元素或一組頁面元素是否有權限,在XML配置文件中描述。

          ?

          ?????? 例如,下面的JSP頁面有“詳細”和“修改”兩個按鈕。

          <%@ taglib uri="http://mytag" prefix="custTag" %>

          <html>

          <head>

          <title>test</title>

          </head>

          <body >

          <form name="form1" >

          ?? <table width="600" border="0" cellspacing="0" cellpadding="2" >

          ????? <tr>

          ?????? <td>

          ??????????? <custTag:JspSecurity elementName="employeedetail" >

          ????????????? <input type="button" name="detail"? value="詳細" >

          ??????????? </custTag:JspSecurity>

          ??????????? <custTag:JspSecurity elementName="employeemodify" >

          ????????????? <input type="button" name="modify"? value="修改" >

          ??????????? </custTag:JspSecurity>

          ??????? </td>

          ????? </tr>

          </table>

          <br>

          </form>

          </body>

          ?

          ?????? 下面XML配置文件內容表示對角色為common的用戶,只對名為employeedetail 的頁面元素即“詳細”按鈕有權限,對角色為“admin”的用戶,對名為employeedetail 和employeemodify的頁面元素即兩個按鈕都有權限。

          <?xml version="1.0" encoding="GB2312"?>

          <security>

          <htmlElement name="employeedetail" >

          <roleName name="common" />

          <roleName name="admin" />

          </htmlElement>

          <htmlElement name="employeemodify" >

          <roleName name="admin" />

          </htmlElement>

          </security>

          ?

          ?????? 定制標簽類JspSecurityTag繼承了BodyTagSupport類。BodyTagSupport有一個變量bodyContent指向起始標志和結束標志之間的內容。JspSecurityTag的私有靜態變量roleList保存從XML文件中取到角色和頁面元素的對應集合,私有變量ElementName對應頁面元素的名稱。當解析該定制標簽時,首先先取到頁面元素的名稱,再取到當前用戶的角色,如果角色有該頁面元素的權限,就顯示標簽正文(即頁面元素),否則不顯示。

          ?

          Pagekage com.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.w3c.dom.*;

          import java.io.*;

          import javax.xml.parsers.*;

          ?

          public class JspSecurityTag extends BodyTagSupport {

          ? //保存從XML文件中取到角色和頁面元素的對應集合

          ? private static ArrayList roleList;

          ? //頁面元素的名稱

          ? private String elementName;

          ?

          ? public void setElementName(String str)

          ? {

          ??? this.elementName=str;

          ? }

          ?

          ? public int doAfterBody() throws JspException{

          ??? if(roleList==null)

          ??? {

          ????? roleList=getList();

          ??? }

          ??? try{

          ??????? //如果認證通過就顯示標簽正文,否則跳過標簽正文,就這么簡單

          ??????? if(isAuthentificated(elementName))

          ??????? {

          ????????? if(bodyContent != null){

          ??????????? JspWriter out=bodyContent.getEnclosingWriter();

          ??????????? bodyContent.writeOut(out);

          ????????? }else

          ????????? {

          ????????? }

          ??????? }

          ??? }catch(Exception e){

          ????? throw new JspException();

          ??? }

          ??? return SKIP_BODY;

          ? }

          ? //從XML配置文件中取到角色和頁面元素的對應,保存到靜態的ArrayList

          ? private ArrayList getList()

          ? {

          ??? DocumentBuilderFactory dbf =

          ??????? DocumentBuilderFactory.newInstance();

          ??? DocumentBuilder db = null;

          ??? Document doc=null;

          ??? NodeList childlist = null;

          ??? String elementName;

          ??? String roleName;

          ??? int index;

          ??? ArrayList theList = new ArrayList();

          ?

          ??? try{

          ????? db = dbf.newDocumentBuilder();

          ??? }catch(Exception e)

          ??? {

          ????? e.printStackTrace();

          ??? }

          ??? try{

          ????? doc = db.parse(new File("security.xml"));

          ??? }catch(Exception e)

          ??? {

          ????? e.printStackTrace();

          ??? }

          ??? //讀取頁面元素列表

          ??? NodeList elementList = doc.getElementsByTagName("htmlElement");

          ??? for(int i=0;i<elementList.getLength();i++)

          ??? {

          ????? Element name = ((Element)elementList.item(i));

          ????? //頁面元素的名稱

          ????? elementName = name.getAttribute("name");

          ????? //該頁面元素對應的有權限的角色的列表

          ????? NodeList rolNodeList = ((NodeList)name.getElementsByTagName("roleName"));

          ????? for(int j=0;j<rolNodeList.getLength();j++)

          ????? {

          ??????? //有權限的角色的名稱

          ??????? //roleName = ((Element)rolNodeList.item(j)).getNodeValue();

          ??????? roleName = ((Element)rolNodeList.item(j)).getAttribute("name");

          ??????? theList.add(new ElementAndRole(elementName,roleName));

          ????? }

          ??? }

          ??? return theList;

          ? }

          ?

          ? //檢查該角色是否有該頁面元素的權限

          ? private boolean isAuthentificated(String elementName)

          ? {

          String roleName = "";

          //在用戶登陸時把該用戶的角色保存到SESSION中,這里只是直接從SESSION中取用//戶角色。

          roleName=this.pageContext.getSession().getAttribute("rolename”);

          // roleList包含elementName屬性為elementName,roleName屬性為roleName的//ElementAndRole對象,則該角色有該頁面元素的權限

          ???? if(roleList.contains(new ElementAndRole(elementName,roleName)))

          ????????? {

          ?????????????? return true;

          ????????? }

          ??? }

          ??? return? false;

          ? }

          ? //表示角色和頁面元素的對應的關系的內部類

          ? class ElementAndRole{

          ??? String elementName;

          ??? String roleName;

          ??? public ElementAndRole(String elementName,String roleName)

          ??? {

          ????? this.elementName=elementName;

          ????? this.roleName=roleName;

          ??? }

          ??? public boolean equals(Object obj)

          ??? {

          ????? return(((ElementAndRole)obj).elementName.equals(this.elementName)&&((ElementAndRole)obj).roleName.equals(this.roleName));

          ??? }

          ? }

          }

          在標簽庫能被JSP頁面使用前,要做以下三個步驟

          1、? 在JSP頁面中包括一個taglib元素,確定需要加載到內存的標簽庫。前面的JSP文件的第一行:<%@ taglib uri="http://mytag" prefix="custTag" %>做的就是這件事。

          2、? 在配置文件web.xml中使用taglib元素確定TLD文件的位置。在web.xml中增加:

          ? <taglib>

          ??? <taglib-uri>http://mytag</taglib-uri>

          ??? <taglib-location>

          ?????? /WEB-INF/mytag.tld

          ??? </taglib-location>

          ? </taglib>

          3、TLD文件必須使用taglib元素標識每個定制標簽極其屬性。

          下面是使用這個標簽庫對應的TLD文件

          <?xml version="1.0" encoding="ISO-8859-1" ?>

          <!DOCTYPE taglib

          ?PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"

          ?"

          <taglib>

          ? <tlibversion>1.0</tlibversion>

          ? <jspversion>1.1</jspversion>

          ? <shortname>myTag</shortname>

          ? <uri/>

          ? <tag>

          ??? <name>JspSecurity</name>

          ??? <tagclass>com.presentation.viewhelper.JspSecurityTag</tagclass>

          ??? <info>

          ?????? JspSecurityTag

          ??? </info>

          ??? <attribute>

          ?????? <name>elementName</name>

          ?????? <required>true</required>

          ?????? <rtexprvalue>true</rtexprvalue>

          ??? </attribute>

          ? </tag>

          </taglib>

          ?

          posted on 2006-10-09 08:56 都市淘沙者 閱讀(881) 評論(3)  編輯  收藏 所屬分類: JSP/PHP

          評論

          # re: 用定制標簽庫和配置文件實現對JSP頁面元素的訪問控制 2008-01-11 16:37 w1bh


          我認為這樣還是把權限侵入到了普通業務中了

          能不能實現:
          權限不 侵入到了普通業務中
          在頁面加載時,把權限動態的注入到頁面,這樣,權限不 侵入到了普通業務中????????
            回復  更多評論   

          # re: 用定制標簽庫和配置文件實現對JSP頁面元素的訪問控制 2008-01-11 16:37 w1bh@tom.com


          我認為這樣還是把權限侵入到了普通業務中了

          能不能實現:
          權限不 侵入到了普通業務中
          在頁面加載時,把權限動態的注入到頁面,這樣,權限不 侵入到了普通業務中!!!
            回復  更多評論   

          # re: 用定制標簽庫和配置文件實現對JSP頁面元素的訪問控制 2012-08-08 17:26 讓你依賴我

          有沒有方法在java類里面 直接得到<custTag:JspSecurity elementName="employeemodify" > 這個標簽的“elementName”屬性的值,(是值)就是“employeemodify”,不要通過解析XML文件來獲取  回復  更多評論   

          主站蜘蛛池模板: 陆丰市| 手游| 福建省| 靖宇县| 白山市| 将乐县| 手游| 瓦房店市| 德惠市| 张家港市| 黄大仙区| 瑞金市| 余干县| 东乡县| 南漳县| 兴文县| 营山县| 修武县| 湄潭县| 邵阳市| 南召县| 宁都县| 乌拉特中旗| 彭州市| 韶山市| 曲阳县| 财经| 乌鲁木齐县| 镇坪县| 澄江县| 宜丰县| 荃湾区| 菏泽市| 申扎县| 肇源县| 随州市| 汾阳市| 长岭县| 泗水县| 威远县| 南投市|