一:概念介紹
1:)資源
可以使用的系統資源.比如注冊用戶是一種資源,修改用戶信息也是一種資源.資源在系統中呈現為一棵樹.假如用戶管理是一個節點.用戶注冊,用戶信息修改為用戶管理的葉子。葉子具有不可分割性.
2:)角色
綁定可操作資源的集合。比如系統管理員,可以使用全部資源.一般用戶,可以注冊和修改查看自己的信息.角色可以有依賴角色。也就是說現在系統中存在RoleA,RoleB,RoleC ,RoleD 四種角色.
RoleD 倚賴RoleA
假設一個用戶的角色是RoleD.
根據倚賴關系。默認有RoleA 的可使用資源.
3:)用戶
系統中的使用者,因為角色可以倚賴,所以一個用戶只有一種角色.
二:資源的分配
上述三個概念之間的綁定關系為用戶綁定一個角色,角色綁定若干資源.角色綁定資源有兩種綁定,一種是綁定葉子,一種綁定節點。綁定節點有兩種一種只綁定節點下的葉子,一種綁定節點下所有的葉子.在系統中權限的分配需要做到一個角色可以訪問整個資源樹中的任意節點和葉子的組合.
三:資源樹的構造
我們使用namespace的方式去構造一棵樹.根節點為空。
下面形如:sysytem.user.useradd,system.department.add,system.common
上面的可以理解為system是一個節點,並有兩個子節點user,department,
一個葉子common
四:Struts中的資源標識
在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綁定到一個跟節點下,我們加一個選項把上面的配置修改為
<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 打印出來會看到相關的配置
五:權限分配的實現
1:)實現角色資源的綁定
在我的實現中我使用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">
<!--綁定綁定一個節點如果include為true綁定所有子葉子-->
</node-list>
</role>
2:)權限的判斷
這一部分有很多中實現方式,一種所有的Action繼承BaseAction
在BaseAction裡面實現,並在沒一個Action裡面去調用判斷.
另外一種交給Struts去判斷
org.apache.struts.action.RequestProcessor
裡面有一個processActionPerform
調用Action的execute去執行Action
我們可以修改processActionPerform讓其在執行execute前先執行權限檢查
如果是這樣的話,必須修改org.apache.struts.action.Action
讓一個方法去實現權限判斷.
如果使用第二種需要修改蠻多源代碼,不建議對Struts不熟悉的人使用.