作者孤魂一笑
一概念介绍
:)资源
可以使用的系统资源比如注册用户是一种资源修改用户信息也是一种资源
资源在系统中呈现为一棵树假如用户管理是一个节点用户注册用户信息
修改为用户管理的叶子叶子具有不可分割性
:)角色
绑定可操作资源的集合
比如系统管理员可以使用全部资源
一般用户可以注册和修改查看自己的信息
角色可以有依赖角色也就是说现在系统中存在
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不熟悉的人使用