|
一:概念介紹 1:)資源 可以使用的系統(tǒng)資源.比如注冊用戶是一種資源,修改用戶信息也是一種資源. 資源在系統(tǒng)中呈現(xiàn)為一棵樹.假如用戶管理是一個節(jié)點.用戶注冊,用戶信息 修改為用戶管理的葉子。葉子具有不可分割性. 2:)角色 綁定可操作資源的集合。 比如系統(tǒng)管理員,可以使用全部資源. 一般用戶,可以注冊和修改查看自己的信息. 角色可以有依賴角色。也就是說現(xiàn)在系統(tǒng)中存在 RoleA,RoleB,RoleC ,RoleD 四種角色. RoleD 倚賴RoleA 假設(shè)一個用戶的角色是RoleD. 根據(jù)倚賴關(guān)系。默認(rèn)有RoleA 的可使用資源. 3:)用戶 系統(tǒng)中的使用者,因為角色可以倚賴,所以一個用戶只有一種角色. 二:資源的分配 上述三個概念之間的綁定關(guān)系為用戶綁定一個角色,角色綁定若干資源. 角色綁定資源有兩種綁定,一種是綁定葉子,一種綁定節(jié)點。綁定節(jié)點有 兩種一種只綁定節(jié)點下的葉子,一種綁定節(jié)點下所有的葉子.在系統(tǒng)中權(quán) 限的分配需要做到一個角色可以訪問整個資源樹中的任意節(jié)點和葉子的組合. 三:資源樹的構(gòu)造 我們使用namespace的方式去構(gòu)造一棵樹.根節(jié)點為空。 下面形如:sysytem.user.useradd,system.department.add,system.common 上面的可以理解為system是一個節(jié)點,并有兩個子節(jié)點user,department, 一個葉子common 四:Struts中的資源標(biāo)識 在Struts中一個Action的配置通常如下: <action path="/editSubscription" type="org.apache.struts.webapp.example.EditSubscriptionAction" attribute="subscriptionForm" scope="request" validate="false"> <forward name="failure" path="/mainMenu.jsp"/> <forward name="success" path="/subscription.jsp"/> </action> 為了使沒一個Action綁定到一個跟節(jié)點下,我們加一個選項把上面的配置修改為 <action path="/editSubscription" type="org.apache.struts.webapp.example.EditSubscriptionAction" attribute="subscriptionForm" scope="request" rights="system.user" validate="false"> <forward name="failure" path="/mainMenu.jsp"/> <forward name="success" path="/subscription.jsp"/> </action> 為了在xml parse的時候可以加載上面的配置,我們需要修改一下Struts的源代碼 修改org/apache/struts/config/ActionConfig 增加如下代碼 protected String rights="common"; public String getRights(){ return this.rights; } public void setRights(String rights){ if (configured) { throw new IllegalStateException("Configuration is frozen"); } this.rights=rights; } 假如修改成功后我們把ActionMapping 打印出來會看到相關(guān)的配置 五:權(quán)限分配的實現(xiàn) 1:)實現(xiàn)角色資源的綁定 在我的實現(xiàn)中我使用xml文件去配置如下: <role name="01"> <resource-list> <resource name="test" url="test.jsp" menu="false"/> <resource name="user" url="user.jsp" menu="true"/> <!--綁定綁定一個葉子--> </resource-list> <node-list> <node name="system.test" include="false"> <!--綁定綁定一個節(jié)點如果include為true綁定所有子葉子--> </node-list> </role> 2:)權(quán)限的判斷 這一部分有很多中實現(xiàn)方式,一種所有的Action繼承BaseAction 在BaseAction里面實現(xiàn),并在沒一個Action里面去調(diào)用判斷. 另外一種交給Struts去判斷 org.apache.struts.action.RequestProcessor 里面有一個processActionPerform 調(diào)用Action的execute去執(zhí)行Action 我們可以修改processActionPerform讓其在執(zhí)行execute前先執(zhí)行權(quán)限檢查 如果是這樣的話,必須修改org.apache.struts.action.Action 讓一個方法去實現(xiàn)權(quán)限判斷. 如果使用第二種需要修改蠻多源代碼,不建議對Struts不熟悉的人使用 |
|
|