一个权限设计教程

找到一篇关于权限设计的教程,写的很好,但是发现给出的代码,有些地方可能有笔误。贴出来供大家和我一起学习。

-----------------------------------
首先,设置三种要素:用户、群组、角色。
用户为登录用,对应到人。群组对应为用户的集合,是一种特殊的用户。角色为一组权限项的集合,用户(群组)都有各自的角色。
权限的实现通过Permission类和Rule类来实现。 Permission供外部调用,Rule为一个接口,为权限判断规则。
Permission是一个抽象类,有以下方法

代码
  1. public boolean hasPermission(User user,HashMap oldData,Input input);  
  2. public String getPermissionName();  
  3. public abstract Rule[] getDenyRule();  
  4. public abstract Rule[] getAcceptRule();  
<script type="text/javascript">render_code();</script>
hasPermission方法供外部调用,已实现,实现方法为:
先根据getDenyRule()得到的规则判断权限是否被阻拦,
再根据getAcceptRule()来判断是否有权限。
而Rule接口的接品则由用户自行定义,随包附带了一个已实现的Rule,实现的功能如下:
先寻找User的所有角色,然后判断角色是否有权限,如果无权限则寻找其父级群组,再取父级群组的所有角色进行判断是否有权限,如果无权限则再往上级群组找,直到找最上一级还是无权限才判断为无权限。
现实现判断权限有无权限的方式已可以达成的有以下三种:
1、 是否有操作的权限。
2、 是否有操作的子操作的权限。
3、 在数据为某条件时有操作(子操作)的权限。
在进行程序开发时,
第一步,编写User,Group,Role的实现类,已提供了一套XML的实现类。
第二步,写配置文件,进行权限项的配置。
第三步,在程序中要进行权限判断的地方调用Permission.hasPermission方法即可。

用户组件
首先,我定义了一个用户接口,可以从其中取出其的各种属性.代码如后面所示.用户除了各种不同的属性以外,还必须设置其角色以及所属的群组.然后 定义一个AbstractUser把User共性的东西进行处理.所有的取属性的方法都已实现.用户只要根据实现情况继承AbstractUser把自己 要定义的属性进行处理即可.(因为每个系统的用户都会有不同的属性,所以留成抽象类供使用者自己扩展). 只要初始化变量description, name ,group ,id, prop,role,propMap即可.最后定义了一个类UserImpl来实现具体的User作随包的一个User供一般使用者使用.不建议直接使用 UserImpl,因为以后的版本可能会重写该类.如果要使用的话可以把该类改名为自己的类即可.这部分涉及到了一个ResourceLib类,该类中存 是我自己定义的存储各种资源配置用的类,可以直接使用.
========================XML格式=====================

代码
  1. <User id="U01">  
  2. <Name>Swan</Name>  
  3. <Description>方志文</Description>  
  4. <ParentGroup id="G01"/>  
  5. <Property name="SEX" value="male"/>  
  6. <Property name="AGE" value="20"/>  
  7. </User>  
<script type="text/javascript">render_code();</script> ========================XML描述文件==================
代码
  1. <xs:complexType name="User">  
  2. <xs:annotation>  
  3. <xs:documentation>用户名</xs:documentation>  
  4. </xs:annotation>  
  5. <xs:sequence>  
  6. <xs:element name="Name"/>  
  7. <xs:element name="Description"/>  
  8. <xs:element name="ParentGroup" type="Identity" minOccurs="0" maxOccurs="unbounded"/>  
  9. <xs:element name="Role" type="Identity" minOccurs="0" maxOccurs="unbounded"/>  
  10. <xs:element name="Property" minOccurs="0" maxOccurs="unbounded">  
  11. <xs:complexType>  
  12. <xs:attribute name="name" use="required"/>  
  13. <xs:attribute name="value" use="required"/>  
  14. </xs:complexType>  
  15. </xs:element>  
  16. </xs:sequence>  
  17. <xs:attribute name="id" use="required"/>  
  18. </xs:complexType>  
<script type="text/javascript">render_code();</script> 群组组件
首先,我定义了一个群组接口,除了继承用户的方法以外还有两个方法,getUsers,getSubGroup.代码如后面所示.用户除了各种不 同的属性以外还必须设置其角色以及所属的群组.然后定义一个AbstractGroup,他继承了Group以及AbstractUser,并实现了 Group接口定义的两个方法.用户只要根据实现情况继承AbstractGroup把自己要定义的属性进行处理即可.(因为每个系统的用户都会有不同的 属性,所以留成抽象类供使用者自己扩展). 只要初始化变量description, name ,group ,id, prop,role,propMap,subGroup,user即可.最后定义了一个类XMLGroup来实现具体的Group作随包的一个Group 供一般使用者使用.不建议直接使用XMLGroup,因为以后的版本可能会重写该类.如果要使用的话可以把该类改名为自己的类即可.这部分涉及到了一个 ResourceLib类,该类中存是我自己定义的存储各种资源配置用的类,可以直接使用.
========================XML格式=====================
代码
  1. <Group id="G01">  
  2. <Name>系统部</Name>  
  3. <Description>系统部</Description>  
  4. </Group>  
<script type="text/javascript">render_code();</script>
========================XML描述文件==================
代码
  1. <xs:complexType name="Group">  
  2. <xs:annotation>  
  3. <xs:documentation>群组</xs:documentation>  
  4. </xs:annotation>  
  5. <xs:complexContent>  
  6. <xs:extension base="User">  
  7. <xs:sequence>  
  8. <xs:element name="SubGroup" type="Identity" minOccurs="0" maxOccurs="unbounded"/>  
  9. <xs:element name="User" type="Identity" minOccurs="0" maxOccurs="unbounded"/>  
  10. </xs:sequence>  
  11. </xs:extension>  
  12. </xs:complexContent>  
  13. </xs:complexType>  
<script type="text/javascript">render_code();</script> 首 先,我定义了一个角色接口,可以从其中取出其的各种属性.代码如后面所示.然后定义一个AbstractRole把Role共性的东西进行处理.所有的取 属性的方法都已实现.用户只要根据实现情况继承AbstractRole把自己要定义的属性进行处理即可.(因为每个系统的用户都会有不同的属性,所以留 成抽象类供使用者自己扩展). 只要初始化变量description, name ,id, prop,users(可能是群组), permissionMap即可.最后定义了一个类XMLRole来实现具体的Role作随包的一个Role供一般使用者使用.不建议直接使用 XMLRole,因为以后的版本可能会重写该类.如果要使用的话可以把该类改名为自己的类即可.这部分涉及到了一个ResourceLib类,该类中存是 我自己定义的存储各种资源配置用的类,可以直接使用.
========================XML格式=====================
代码
  1. <Role id="R01">  
  2. <Name>系统管理员</Name>  
  3. <Description>系统管理员</Description>  
  4. </Role>  
<script type="text/javascript">render_code();</script>
========================XML描述文件==================
代码
  1. <xs:complexType name="Role">  
  2. <xs:annotation>  
  3. <xs:documentation>角色名</xs:documentation>  
  4. </xs:annotation>  
  5. <xs:sequence>  
  6. <xs:element name="Name"/>  
  7. <xs:element name="Description"/>  
  8. <xs:element name="Property" minOccurs="0" maxOccurs="unbounded"/>  
  9. </xs:sequence>  
  10. <xs:attribute name="id" use="required"/>  
  11. </xs:complexType>  
<script type="text/javascript">render_code();</script> 规则
定义好User,Group,Role了以后,下面我定义了权限判断的规则.首先定义Rule接口,见Rule.java.Rule只做一件事判断User是否有权限.
然后我实现了一个Rule,见RuleImpl.java.这部分涉及到了一个Input类,这个类是一个输入的类,接口如Input.java.这个通过继承该接口可以使用各种方式数据(HTTP,XML,SOAP……)作为输入数据.
Permission为权限类,下面一篇会介绍.
权限
最后,我定义了一个Permission类把所有的元素连接起来形成一个完整权限判断组件。代码如下。用户继承该类时要完两个方法 getDenyRule,getAcceptRule即可。 当我们进行权限判断时只要调用hasPermission(User user,HashMap oldData,Input input)即可。其后三个参数分别为用户,数据,输入。用户为在判断的人,数据为原有数据,比较进行更新操作时,oldData为老数据,input在 前一部分有介绍,为一个通用的输入方式。比如WEB输入Post或Get方式等,可以转换成一个Input类,也可以手动新建一个Input.为操作以及 其数据的集合。 在Permission类中进行了DenyRule和AcceptRule的判断,只要有一个DenyRule规则符合要求,则认为该用户无权限进行操 作,如果用户的没被DenyRule排除则进行AcceptRule的判断,只要有一个规则符合要求则认为该用户有权限。 因为本人比较懒所以Permission的实现还没有写出一个通用的。 综上所述,使用此权限组件要进行以下几项工作:
1、 编写User的实现。
2、 编写Group的实现。
3、 编写Role的实现。
4、 编写Permission的实现。(过段时间我会摆个通用的上来)
5、 编写N个Rule(同你的系统要进行权限判断相对应)。
6、 在程序中调用Permission.hasPermission判断。
其它原意是给大家看一下结构,没想大家都那么关心,我现在把所有的代码贴上来,谢谢大家关心.唉,BLOG好烦啊,无法直接上传文件要一个一个贴
#############源代码单独整理了。可能有一些地方笔误了。是原来的教程原因。代码在附件中######
src.rar
 描述:  
下载
 文件名: src.rar
 文件大小: 13 KB
 下载过的: 文件被下载或查看 922 次

声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。若作者同意转载,必须以超链接形式标明文章原始出处和作者。  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值