java

位置:IT落伍者 >> java >> 浏览文章

基于Struts的权限实现


发布日期:2019年01月12日
 
基于Struts的权限实现

作者孤魂一笑

概念介绍

:)资源

可以使用的系统资源比如注册用户是一种资源修改用户信息也是一种资源

资源在系统中呈现为一棵树假如用户管理是一个节点用户注册用户信息

修改为用户管理的叶子叶子具有不可分割性

:)角色

绑定可操作资源的集合

比如系统管理员可以使用全部资源

一般用户可以注册和修改查看自己的信息

角色可以有依赖角色也就是说现在系统中存在

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不熟悉的人使用

上一篇:Spring2.5注释驱动与基于注释的MVC

下一篇:Spring事务处理及其AOP框架的内幕