blgaici 2009-04-20 12:48
浏览 450
已采纳

数据库,如何分角色权限建表?

[color=blue][color=blue][/color]使用人员:
1.教务系统的超级管理员!
2.教学秘书!
3.老师!
4.楼长!
5.楼管!
要求:超级管理员可以管理教学秘书,老师,楼长,楼管!
一个系一个教学秘书,教学秘书只可以管理本系的老师!
一个楼长可能管理一个或多个楼!楼长管理各楼内的楼管!
一个楼层管理员可能管理一层或多层楼![/color]

  • 写回答

2条回答 默认 最新

  • Candyut 2009-04-22 08:49
    关注

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

    public String getPermissionName();;

    public abstract Rule[] getDenyRule();;

    public abstract Rule[] getAcceptRule();;

    public boolean hasPermission(User user,HashMap oldData,Input input);;
    public String getPermissionName();;
    public abstract Rule[] getDenyRule();;
    public abstract Rule[] getAcceptRule();;
    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格式=====================
    Java代码


    Swan

    方志文








    Swan
    方志文



    ========================XML描述文件==================
    Java代码


    xs:annotation

    xs:documentation用户名/xs:documentation

    /xs:annotation

    xs:sequence











    xs:complexType





    /xs:complexType

    /xs:element

    /xs:sequence



    /xs:complexType


    xs:annotation
    xs:documentation用户名/xs:documentation
    /xs:annotation
    xs:sequence





    xs:complexType


    /xs:complexType
    /xs:element
    /xs:sequence

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


    系统部

    系统部


    系统部
    系统部

    ========================XML描述文件==================
    Java代码


    xs:annotation

    xs:documentation群组/xs:documentation

    /xs:annotation

    xs:complexContent



    xs:sequence





    /xs:sequence

    /xs:extension

    /xs:complexContent

    /xs:complexType


    xs:annotation
    xs:documentation群组/xs:documentation
    /xs:annotation
    xs:complexContent

    xs:sequence


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


    系统管理员

    系统管理员


    系统管理员
    系统管理员

    ========================XML描述文件==================
    Java代码


    xs:annotation

    xs:documentation角色名/xs:documentation

    /xs:annotation

    xs:sequence







    /xs:sequence



    /xs:complexType


    xs:annotation
    xs:documentation角色名/xs:documentation
    /xs:annotation
    xs:sequence



    /xs:sequence

    /xs:complexType规则
    定义好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判断。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能