熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

基於Struts的權限實現

2013-11-23 20:33:13  來源: Java開源技術 

  
  作者孤魂一笑  
  
  
  概念介紹
  
  :)資源
  可以使用的系統資源比如注冊用戶是一種資源修改用戶信息也是一種資源
  資源在系統中呈現為一棵樹假如用戶管理是一個節點用戶注冊用戶信息
  修改為用戶管理的葉子葉子具有不可分割性
  
  :)角色
  綁定可操作資源的集合
  比如系統管理員可以使用全部資源
  一般用戶可以注冊和修改查看自己的信息
  角色可以有依賴角色也就是說現在系統中存在
  RoleARoleBRoleC RoleD 四種角色
  RoleD 倚賴RoleA
  假設一個用戶的角色是RoleD
  根據倚賴關系默認有RoleA 的可使用資源
  
  :)用戶
  系統中的使用者因為角色可以倚賴所以一個用戶只有一種角色
  
  資源的分配
  
  上述三個概念之間的綁定關系為用戶綁定一個角色角色綁定若干資源
  角色綁定資源有兩種綁定一種是綁定葉子一種綁定節點綁定節點有
  兩種一種只綁定節點下的葉子一種綁定節點下所有的葉子在系統中權
  限的分配需要做到一個角色可以訪問整個資源樹中的任意節點和葉子的組合
  
  資源樹的構造
  
  我們使用namespace的方式去構造一棵樹根節點為空
  下面形如:sysytemuseruseraddsystemdepartmentaddmon
  上面的可以理解為system是一個節點並有兩個子節點userdepartment
  一個葉子common
  
  Struts中的資源標識
  
  在Struts中一個Action的配置通常如下:
  
  <action path=/editSubscription
  type=orgapachestrutswebappexampleEditSubscriptionAction
  attribute=subscriptionForm
  scope=request
  validate=false>
  <forward name=failure path=/mainMenujsp/>
  <forward name=success path=/subscriptionjsp/>
  </action>
  
  為了使沒一個Action綁定到一個跟節點下我們加一個選項把上面的配置修改為
  <action path=/editSubscription
  type=orgapachestrutswebappexampleEditSubscriptionAction
  attribute=subscriptionForm
  scope=request
  rights=systemuser
  validate=false>
  <forward name=failure path=/mainMenujsp/>
  <forward name=success path=/subscriptionjsp/>
  </action>
  
  為了在xml parse的時候可以加載上面的配置我們需要修改一下Struts的源代碼
  修改org/apache/struts/config/ActionConfig
  增加如下代碼
  
  protected String rights=common;
  
  public String getRights(){
  return thisrights;
  }
  
  public void setRights(String rights){
  if (configured) {
  throw new IllegalStateException(Configuration is frozen);
  }
  thisrights=rights;
  }
  
  假如修改成功後我們把ActionMapping 打印出來會看到相關的配置
  
  權限分配的實現
  
  :)實現角色資源的綁定
  在我的實現中我使用xml文件去配置如下
  <role name=>
  <resourcelist>
  <resource name=test url=testjsp menu=false/>
  <resource name=user url=userjsp menu=true/>
  <!綁定綁定一個葉子>
  </resourcelist>
  <nodelist>
  <node name=systemtest include=false>
  <!綁定綁定一個節點如果include為true綁定所有子葉子>
  </nodelist>
  </role>
  
  :)權限的判斷
  這一部分有很多中實現方式一種所有的Action繼承BaseAction
  在BaseAction裡面實現並在沒一個Action裡面去調用判斷
  
  另外一種交給Struts去判斷
  orgapachestrutsactionRequestProcessor
  裡面有一個processActionPerform
  調用Action的execute去執行Action
  我們可以修改processActionPerform讓其在執行execute前先執行權限檢查
  如果是這樣的話必須修改orgapachestrutsactionAction
  讓一個方法去實現權限判斷
  
  如果使用第二種需要修改蠻多源代碼不建議對Struts不熟悉的人使用

From:http://tw.wingwit.com/Article/program/Java/ky/201311/28653.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.