首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

基於 Struts 的權限實現機制詳解

     編輯:Java 相關知識

核心概念介紹

在基於 Struts 的權限體系中,有三個核心概念:資源、角色與用戶。

1. 資源

資源代表系統中可被操作的對象,例如「註冊用戶」、「修改用戶信息」等。資源在系統中以樹狀結構呈現:父節點如「用戶管理」,葉子節點如「用戶註冊」、「用戶信息修改」。葉子節點具有不可分割性。

2. 角色

角色是一組可操作資源的集合。例如「系統管理員」擁有所有資源權限,而「一般用戶」僅能註冊、修改及查看自身信息。角色之間支援依賴關係:若 RoleD 依賴 RoleA,則擁有 RoleD 的用戶自動擁有 RoleA 的資源權限。

3. 用戶

系統使用者,每個用戶僅綁定一種角色(因角色可依賴,故單一角色即可涵蓋所需權限)。

資源分配策略

用戶 → 角色 → 資源。角色綁定資源有兩種方式:綁定葉子節點,或綁定父節點。綁定父節點時,可選擇「僅綁定該節點下的葉子」或「綁定該節點下所有葉子」。系統需支援任意節點與葉子的組合授權。

資源樹的構造

採用命名空間方式構建資源樹,根節點為空。例如:

system.user.useradd
system.department.add
system.common

上述結構中,system 為父節點,user 和 department 為子節點,common 為葉子節點。

Struts 中的資源標識

在 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;
}

權限分配的實現

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. 權限判斷實現方式

  • 基於 BaseAction:所有 Action 繼承 BaseAction,在其中實現權限檢查,各 Action 調用判斷方法。
  • 修改 RequestProcessor:覆寫 processActionPerform,在執行 execute 前進行權限校驗。此法需修改 org.apache.struts.action.Action 增加判斷方法,改動較大,不建議對 Struts 不熟悉的開發者採用。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved