`
zhangyi6678
  • 浏览: 76478 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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

阅读更多

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




首先,设置三种要素:用户、群组、角色。
用户为登录用,对应到人。群组对应为用户的集合,是一种特殊的用户。角色为一组权限项的集合,用户(群组)都有各自的角色。
权限的实现通过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代码
<User id="U01">  
<Name>Swan</Name>  
<Description>方志文</Description>  
<ParentGroup id="G01"/>  
<Property name="SEX" value="male"/>  
<Property name="AGE" value="20"/>  
</User>

<User id="U01">
<Name>Swan</Name>
<Description>方志文</Description>
<ParentGroup id="G01"/>
<Property name="SEX" value="male"/>
<Property name="AGE" value="20"/>
</User>========================XML描述文件==================
Java代码
<xs:complexType name="User">  
<xs:annotation>  
<xs:documentation>用户名</xs:documentation>  
</xs:annotation>  
<xs:sequence>  
<xs:element name="Name"/>  
<xs:element name="Description"/>  
<xs:element name="ParentGroup" type="Identity" minOccurs="0" maxOccurs="unbounded"/>  
<xs:element name="Role" type="Identity" minOccurs="0" maxOccurs="unbounded"/>  
<xs:element name="Property" minOccurs="0" maxOccurs="unbounded">  
<xs:complexType>  
<xs:attribute name="name" use="required"/>  
<xs:attribute name="value" use="required"/>  
</xs:complexType>  
</xs:element>  
</xs:sequence>  
<xs:attribute name="id" use="required"/>  
</xs:complexType>

<xs:complexType name="User">
<xs:annotation>
<xs:documentation>用户名</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="Name"/>
<xs:element name="Description"/>
<xs:element name="ParentGroup" type="Identity" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="Role" type="Identity" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="Property" minOccurs="0" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="name" use="required"/>
<xs:attribute name="value" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="id" use="required"/>
</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代码
<Group id="G01">  
<Name>系统部</Name>  
<Description>系统部</Description>  
</Group>

<Group id="G01">
<Name>系统部</Name>
<Description>系统部</Description>
</Group>
========================XML描述文件==================
Java代码
<xs:complexType name="Group">  
<xs:annotation>  
<xs:documentation>群组</xs:documentation>  
</xs:annotation>  
<xs:complexContent>  
<xs:extension base="User">  
<xs:sequence>  
<xs:element name="SubGroup" type="Identity" minOccurs="0" maxOccurs="unbounded"/>  
<xs:element name="User" type="Identity" minOccurs="0" maxOccurs="unbounded"/>  
</xs:sequence>  
</xs:extension>  
</xs:complexContent>  
</xs:complexType>

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

<Role id="R01">
<Name>系统管理员</Name>
<Description>系统管理员</Description>
</Role>
========================XML描述文件==================
Java代码
<xs:complexType name="Role">  
<xs:annotation>  
<xs:documentation>角色名</xs:documentation>  
</xs:annotation>  
<xs:sequence>  
<xs:element name="Name"/>  
<xs:element name="Description"/>  
<xs:element name="Property" minOccurs="0" maxOccurs="unbounded"/>  
</xs:sequence>  
<xs:attribute name="id" use="required"/>  
</xs:complexType>

<xs:complexType name="Role">
<xs:annotation>
<xs:documentation>角色名</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="Name"/>
<xs:element name="Description"/>
<xs:element name="Property" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="id" use="required"/>
</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判断。

分享到:
评论

相关推荐

    基于角色的权限管理数据库设计

    基于角色的权限管理数据库设计。内有建表语句及测试语句。

    Springboot角色权限后台管理系统脚手架实战开发教程包含完整源码

    系统实现的功能主要有用户管理、角色管理、权限管理、日志管理、数据库备份等等,涉及的知识点有:springboot框架原理、freemark模板标签语法、jpa数据库操作及自动建表、统一上传文件实现方法、自定义注解实现统一...

    Mybatis之xml开发-用户角色权限关联案例(答案)

    博文【Mybatis】Mybatis之xml开发—用户角色权限关联案例一文中提供有数据库建表资源和2个练习案例的具体要求。如有需要请去主页查看相应文章。 博主主页链接:https://blog.csdn.net/zsy3757486?type=lately 文章...

    campus-market_springboot_后台管理系统_stand3fu_数据权限控制_

    springboot角色权限后台管理系统脚手架实战开发教程包含完整源码系统实现的功能主要有用户管理、角色管理、权限管理、日志管理、数据库备份等等,涉及的知识点有:springboot框架原理、freemark模板标签语法、jpa...

    用户管理系统(权限管理)建表语句和UML.rar

    用户管理,权限管理模块的数据库表结果和建表语句,包含UML模型。表结构包含用户管理,系统管理,菜单管理,权限管理,角色管理,组管理等

    用户角色菜单权限表结构创建以及数据插入

    用户菜单权限表建表语句以及数据插入语句,后台管理系统搭建必备,学习专用。 如果使用外键关联,在对表进行数据操作时就考虑另一张关联的表,相当于两张表就绑在一起了,操作这张表就必须考虑另一张关联表。我们...

    达梦数据库_SQL语言手册

    回收权限语句角色权限 策略与标记管理 创建策略 修改策略 删除策略 安全标记 用户标记设置语句 表标记设置语句 审计设置语句 审计取消语句 审计信息查阅语句 审计分析 创建审计分析规则 删除审计分析...

    根据用户权限动态加载Treeview

    根据一个用户的权限动态加载Treeview菜单。附有代码,数据库建表文件,图片,自己建表之后填充数据就可以自己查看了。

    ORACLE数据库智能化管理系统2012

    还在为数据库安全情况,表或角色权限批量授权或撤权,操作起来又费时费力,而烦恼吗? 还在为需要多表数据综合计算才能求得到想要的数据结果,而书写SQL语句书写起来复杂而烦恼吗? 还在为达到求某种数据值需要多表...

    数据库大作业(考勤系统).zip

    包括建库建表,存储过程,非对称密钥加密,数据脱敏,角色权限管理,用户与管理员角度的演示 1、数据库设计(3-4表) 2、设计与实现(安全)(重点) 存储过程、触发器、事务 安全技术:加密与解密,校验(防篡改...

    实验1答案 - 建立学生数据库.sql

    3、使用数据库的可视化工具建库建表 建立银行贷款表,具体要求同课堂教学的建库建表一致。 银行表(BankT)( 银行代码(Bno) 主键 银行名称(Bname) 非空 电话(Tel) ) 法人表(LET)( 法人代码...

    医药销售管理系统数据库课程设计.docx

    结合需求分析与概念结构设计把设计好的E-R图转换为DBMS所支持的数据模型所符合的逻辑结构,此系统只针对医药超市内部管理使用,运用SQL数据库管理系统建表录入数据,进行查询、插入、删除、修改等操作。 关键词: ...

    基于SpringBoot+shiro+ztree的权限管理后台源码+数据库文件.zip

    1、系统管理后台基本框架SPPanAdmin,包括用户管理,角色管理,资源链接管理模块,可以动态分配权限和角色。 2、使用springboot、springdata jpa、shiro等服务端技术,使用freemarker模版渲染页面。 3、系统中对...

    数据库安全大作业(书库管理).zip

    包括建库建表,存储过程,非对称密钥加密,数据脱敏,角色权限管理,用户与管理员角度的演示

    SQLServer2005数据库学习笔记

    ├─13权限、角色和架构 │ schema.sql │ Sql Server 2005中的架构(Schema)用户(User)角色(Role)和登录(Login).pdf │ ├─14 数据库备份与恢复 │ Backup.sql │ └─15 其它应用 other.sql SQL Server将数据...

    WPF实现的用户管理系统

    用WPF实现的用户管理系统,主要实现用户的增删查改操作,数据库使用的是MYSQL数据库,资源中有数据库的建表语句,在数据库中建表后,在App.Config文件中修改数据库连接就可以跑起来,仅供WPF的学习。

    Oracle新建用户、角色,授权,建表空间的sql语句

    oracle数据库的权限系统分为系统权限与对象权限。系统权限( database system privilege )可以让用户执行特定的命令集。例如,create table权限允许用户创建表,grant any privilege 权限允许用户授予任何系统权限。...

    oracle数据库经典题目

    一、填空 1.在多进程Oracle实例系统中,进程分为用户进程、后台进程和服务进程...9.简述Oracle数据库角色的种类、作用,以及如何利用角色为用户授权。 答案: Oracle数据库中角色分为系统预定义的角色和用户自定义的...

    图书管理系统数据库结构及实体类.doc

    "借书证号 " " "logname "Varchar(16) "登录名 "非空 " "pwd "varchar(32) "密码 "非空 " "realname "Varchar(16) "真实姓名 " " "role "Int "权限/角色 "非空 " "记录表TLog " "字段名 "类型 "描述 "备注 " "uid ...

    基于MFC开发的班级通讯录

    开发工具:VS.NET 2003 ...管理员分为普通管理员和高级管理员两个角色,不同角色具有不同权限。管理员可以对用户进行删除、添加、修改操作。 注意:系统的管理员管理没有去做,课程设计时间比较紧,请见谅

Global site tag (gtag.js) - Google Analytics