在基於 Struts 的權限體系中,有三個核心概念:資源、角色與用戶。
資源代表系統中可被操作的對象,例如「註冊用戶」、「修改用戶信息」等。資源在系統中以樹狀結構呈現:父節點如「用戶管理」,葉子節點如「用戶註冊」、「用戶信息修改」。葉子節點具有不可分割性。
角色是一組可操作資源的集合。例如「系統管理員」擁有所有資源權限,而「一般用戶」僅能註冊、修改及查看自身信息。角色之間支援依賴關係:若 RoleD 依賴 RoleA,則擁有 RoleD 的用戶自動擁有 RoleA 的資源權限。
系統使用者,每個用戶僅綁定一種角色(因角色可依賴,故單一角色即可涵蓋所需權限)。
用戶 → 角色 → 資源。角色綁定資源有兩種方式:綁定葉子節點,或綁定父節點。綁定父節點時,可選擇「僅綁定該節點下的葉子」或「綁定該節點下所有葉子」。系統需支援任意節點與葉子的組合授權。
採用命名空間方式構建資源樹,根節點為空。例如:
system.user.useradd
system.department.add
system.common
上述結構中,system 為父節點,user 和 department 為子節點,common 為葉子節點。
在 Struts Action 配置中新增 rights 屬性,將 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>
為使解析器識別該屬性,需修改 Struts 源碼 org.apache.struts.config.ActionConfig,新增 rights 欄位及其 getter/setter:
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;
}
採用 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>
processActionPerform,在執行 execute 前進行權限校驗。此法需修改 org.apache.struts.action.Action 增加判斷方法,改動較大,不建議對 Struts 不熟悉的開發者採用。