java用户角色权限数据库设计
java后台 管理员 权限 设计 与 多种实现
1. 概念权限控制有几个概念:用户、角色、资源、操作、许可一个用户可以拥有多个角色,一个角色可以对应多个用户,一个角色拥有对某些资源的操作,一个资源操作可以授予多个角色,那么哪个角色可以操作哪些资源记录在许可里。
2. 几个table参考Create table--用户表,存放用户信息create table SYS_USR(USR_ID VARCHAR(20) not null,USR_NAME VARCHAR(20),USR_PWD VARCHAR(30),USR_PWD_QUESTION VARCHAR(100),USR_PWD_ANSWER VARCHAR(100),USR_REMARK VARCHAR(255),USR_DISABLE_DATE DA TEtime,USR_EMAIL VARCHAR(50) not null,USR_CREATE_BY VARCHAR(20),USR_CREATE_DATE DATEtime,USR_UPDATE_BY VARCHAR(20),USR_UPDATE_DATE DATEtime)-- Create table--群组表,存放群组信息create table SYS_GROUP(GROUP_ID VARCHAR(20) not null,GROUP_NAME VARCHAR(50) not null,GROUP_REMARK VARCHAR(255),GROUP_CREATE_BY VARCHAR(20),GROUP_CREATE_datetime datetime,GROUP_UPdatetime_BY VARCHAR(20),GROUP_UPdatetime_datetime datetime,GROUP_DISABLE_datetime datetime)-- Create table--用户群组表,存放哪些用户属于哪个群组create table SYS_USR_GROUP(USR_ID VARCHAR(20) not null,GROUP_ID VARCHAR(20) not null,USR_GROUP_REMARK VARCHAR(255),USR_GROUP_CREATE_BY VARCHAR(20),USR_GROUPCREATE_datetime datetime,USR_GROUPUPdatetime_BY VARCHAR(20),USR_GROUPUPdatetime_datetime datetime)-- Create table-- 功能表,这里可以放页面create table SYS_FUNCTION(FUNC_ID VARCHAR(20) not null,FUNC_NAME VARCHAR(20),FUNC_FATHER_ID VARCHAR(20),FUNC_DESC VARCHAR(100),FUNC_REMARK VARCHAR(255),FUNC_DISABLE_datetime datetime,FUNC_CREATE_BY VARCHAR(20),FUNC_CREATE_datetime datetime,FUNC_UPdatetime_BY VARCHAR(20),FUNC_UPdatetime_datetime datetime)-- Create table-- 群组功能表,存放群组可以访问的页面create table SYS_GROUP_FUNC(GROUP_ID VARCHAR(20) not null,FUNC_ID VARCHAR(20) not null,GROUP_FUNC_REMARK VARCHAR(255),GROUP_FUNC_CREATE_BY VARCHAR(20),GROUP_FUNC_CREATE_datetime datetime,GROUP_FUNC_UPdatetime_BY VARCHAR(20),GROUP_FUNC_UPdatetime_datetime datetime)最后通过sql 语句串起来,可以得到一个用户属于哪个群组,这个群组又有访问哪些页面的权限,这样这个用户访问页面的权限就确定了.3. Filter实现<!--超级管理员--><filter><filter-name>adminCheck</filter-name><filter-class>com.tianhua.filter.AdminRightCheck</filter-class></filter><filter-mapping><filter-name>adminCheckUser</filter-name><url-pattern>/admin/user/*</url-pattern></filter-mapping><!--小权限管理员--><filter><filter-name>adminCheckUser</filter-name><filter-class>com.tianhua.filter.AdminRightCheckUser</filter-class> </filter><filter-mapping><filter-name>adminCheckUser</filter-name><url-pattern>/admin/user/*</url-pattern></filter-mapping>public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {// TODO Auto-generated method stubHttpServletRequest req = (HttpServletRequest) request;HttpServletResponse res = (HttpServletResponse) response;HttpSession session = req.getSession(true);AdminDto dto = (AdminDto) session.getAttribute("adminDto");if (dto == null) {res.sendRedirect(url);} else if (!"1".equals(dto.getAdminRightFlag())) {res.sendRedirect(url);} else {chain.doFilter(request, response);}}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {// TODO Auto-generated method stubHttpServletRequest req = (HttpServletRequest) request;HttpServletResponse res = (HttpServletResponse) response;HttpSession session = req.getSession(true);AdminDto dto = (AdminDto) session.getAttribute("adminDto");if (dto == null) {res.sendRedirect(url);} else if (!"1".equals(dto.getAdminRightFlag())) {res.sendRedirect(url);} else {chain.doFilter(request, response);}}4. Java用户角色权限设计实现业务系统中的用户权限管理B/S系统中的权限比C/S中的更显的重要,C/S系统因为具有特殊的客户端,所以访问用户的权限检测可以通过客户端实现或通过客户端+服务器检测实现,而B/S中,浏览器是每一台计算机都已具备的,如果不建立一个完整的权限检测,那么一个“非法用户”很可能就能通过浏览器轻易访问到B/S系统中的所有功能。
用户、角色、权限数据库设计
⽤户、⾓⾊、权限数据库设计权限管理权限管理,主要是⼈员和权限之间的关系,但是如果让⼈员直接和权限打交道,那么权限的赋值、权限的撤销以及权限的变动会⾮常的⿇烦,这样引⼊了,⾓⾊,给⾓⾊赋权限,然后给⽤户分配⾓⾊。
这个设计主要涉及6张表,⽤户表(⽤于存储⽤户的所有信息)权限表(⽤于存储所有的权限)⾓⾊表(⽤于存储所有的⾓⾊)⽤户和⾓⾊的关联表(⽤户和⾓⾊的关联)⾓⾊和权限的关联表(⾓⾊和权限的关联)菜单表(⾥⾯关联了权限,主要是现实⽤的)⽤户表CREATE TABLE [dbo].[Users]([UserID] [int] IDENTITY(1,1) NOT NULL,[UserName] [nvarchar](50) primary key,--帐号[Password] [nvarchar](50) ,[UserDspName] [nvarchar](50) ,[Sex] [char](1),[Birthday] [datetime],[Phone] [nvarchar](20) ,[Email] [nvarchar](100),[EmployeeID] [nvarchar](20) ,[Activity] [bit],--是否可⽤[UserType] [char](2) ,[Style] [nvarchar](50))权限表:CREATE TABLE [dbo].[Permission]([PermissionID] int identity,[Description] [nvarchar](50) --权限名称)⾓⾊表:CREATE TABLE [dbo].[Roles]([RoleID] [int] IDENTITY,[Description] [nvarchar](200)--⾓⾊名称)⽤户和⾓⾊的关联表:CREATE TABLE [dbo].[UserRoles]([UserID] [int] NOT NULL,--⽤户ID[RoleID] [int] not null ,--权限IDCONSTRAINT [PK_UserRoles] PRIMARY KEY CLUSTERED([UserID] ASC,[RoleID] ASC)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]) ON [PRIMARY]⾓⾊和权限的关联表:CREATE TABLE [dbo].[RolePermissions]([RoleID] int NOT NULL,--⾓⾊ID[PermissionID]int NOT NULL,--权限IDCONSTRAINT [PK_RolePermissions] PRIMARY KEY CLUSTERED([RoleID] ASC,[PermissionID] ASC)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY]菜单表:CREATE TABLE [dbo].[menu]([ID] [int] IDENTITY(1,1) NOT NULL,[TextCH] [nvarchar](100) NULL,--菜单的中⽂显⽰ [TextEN] [nvarchar](200) NULL,--菜单的英⽂名称 [ParentID] [int] NULL,--⽗节点[orderID] [int] NULL,--同⼀个⽗节点下⾯的排序[Url] [nvarchar](200) ,--菜单对于的权限[PermissionID] [int] NULL,--权限ID[ImageUrl] [nvarchar](50) NULL--菜单图⽚链接) ON [PRIMARY]。
java项目中的角色判断方法
一、引言在Java项目中,角色判断是非常常见和重要的功能之一。
通过角色判断,可以实现不同身份用户对系统资源的不同访问权限,保障系统的安全性和稳定性。
本文将介绍在Java项目中常用的角色判断方法,以及它们的优缺点和适用场景。
二、基于角色的访问控制(RBAC)RBAC(Role-Based Access Control)是目前应用最广泛的角色判断方法之一。
它将系统中的用户分配到不同的角色中,然后通过将角色与权限进行关联,实现对系统资源的访问控制。
在Java项目中,RBAC通常通过数据库表来实现用户-角色和角色-权限的关联。
优点:1. 灵活性高:通过调整用户和角色的关联关系,可以快速改变用户的访问权限。
2. 安全性好:通过角色进行访问控制,避免了直接管理每个用户的权限,提高了系统的安全性。
缺点:1. 配置复杂:RBAC需要维护用户-角色和角色-权限之间的关联关系,配置较为复杂。
2. 系统性能:大规模的RBAC系统可能会导致数据库查询压力增大,影响系统性能。
适用场景:RBAC适用于对用户进行动态的访问控制,并且用户和角色之间的关联关系经常发生变化的系统。
三、基于注解的角色判断除了RBAC外,基于注解的角色判断也是一种常见的方法。
在Java项目中,我们可以通过自定义注解来对方法或者类进行角色的判断,从而实现对系统资源的访问控制。
优点:1. 灵活性高:通过为方法或者类添加不同的注解,可以灵活地实现对不同角色的访问控制。
2. 可读性强:通过注解的方式,可以清晰地看出不同的方法或者类对应的访问权限。
缺点:1. 配置复杂:需要对注解进行合理的设计和管理,否则系统可能会变得难以维护。
2. 扩展性差:一旦系统需求发生变化,可能需要对大量的注解进行修改,扩展性差。
适用场景:基于注解的角色判断适用于需要对系统资源进行细粒度控制的系统,同时能够充分利用注解的特性,简化代码逻辑。
四、基于过滤器的角色判断另一种常见的角色判断方法是基于过滤器。
Java利用Mybatis进行数据权限控制
Java利⽤Mybatis进⾏数据权限控制权限控制主要分为两块,认证(Authentication)与授权(Authorization)。
认证之后确认了⾝份正确,业务系统就会进⾏授权,现在业界⽐较流⾏的模型就是RBAC(Role-Based Access Control)。
RBAC包含为下⾯四个要素:⽤户、⾓⾊、权限、资源。
⽤户是源头,资源是⽬标,⽤户绑定⾄⾓⾊,资源与权限关联,最终将⾓⾊与权限关联,就形成了⽐较完整灵活的权限控制模型。
资源是最终需要控制的标的物,但是我们在⼀个业务系统中要将哪些元素作为待控制的资源呢?我将系统中待控制的资源分为三类:1. URL访问资源(接⼝以及⽹页)2. 界⾯元素资源(增删改查导⼊导出的按钮,重要的业务数据展⽰与否等)3. 数据资源现在业内普遍的实现⽅案实际上很粗放,就是单纯的“菜单控制”,通过菜单显⽰与否来达到控制权限的⽬的。
我仔细分析过,现在⼤家做的平台分为To C和To B两种:1. To C⼀般不会有太多的复杂权限控制,甚⾄⼤部分连菜单控制都不⽤,全部都可以访问。
2. To B⼀般都不是开放的,只要做好认证关⼝,能够进⼊系统的只有内部员⼯。
⼤部分企业内部的员⼯互联⽹知识有限,⽽且作为内部员⼯不敢对系统进⾏破坏性的尝试。
所以针对现在的情况,考虑成本与产出,⼤部分设计者也不愿意在权限上进⾏太多的研发⼒量。
菜单和界⾯元素⼀般都是由前端编码配合存储数据实现,URL访问资源的控制也有⼀些框架⽐如SpringSecurity,Shiro。
⽬前我还没有找到过数据权限控制的框架或者⽅法,所以⾃⼰整理了⼀份。
数据权限控制原理数据权限控制最终的效果是会要求在同⼀个数据请求⽅法中,根据不同的权限返回不同的数据集,⽽且⽆需并且不能由研发编码控制。
这样⼤家的第⼀想法应该就是AOP,拦截所有的底层⽅法,加⼊过滤条件。
这样的⽅式兼容性较强,但是复杂程度也会更⾼。
我们这套系统中,采⽤的是利⽤Mybatis的plugin机制,在底层SQL解析时替换增加过滤条件。
jpa 数据权限控制实现方法
jpa 数据权限控制实现方法JPA(Java Persistence API)是一个Java规范,用于将Java对象映射到关系数据库中。
在使用JPA进行数据持久化时,对数据进行权限控制是一个重要的考虑因素。
以下是实现数据权限控制的一些常见方法:1. 使用数据库权限:你可以使用数据库的权限系统来控制对数据的访问。
例如,你可以为不同的用户或角色分配不同的数据库权限,如SELECT、INSERT、UPDATE、DELETE等。
2. 使用JPA的查询方法:JPA提供了多种查询方法,如`createQuery()`,`createNativeQuery()`等,可以根据需要筛选数据。
使用这些方法时,可以很容易地加入查询条件来限制返回的数据。
3. 自定义存储过程或函数:在某些数据库中,你可以编写自定义的存储过程或函数来处理数据权限逻辑。
例如,你可以在存储过程中加入逻辑来检查当前用户的权限,然后返回相应的数据。
4. 使用Spring Security或其他安全框架:Spring Security是一个流行的Java安全框架,可以与JPA结合使用。
它提供了强大的安全功能,如角色和权限管理、URL安全、表单验证等。
Spring Security可以与JPA一起工作,以确保只有具有适当权限的用户才能访问或修改数据。
5. 使用AOP(面向切面编程):AOP允许程序员定义“切面”,这些切面可以在方法的调用之前、之后或抛出异常时执行代码。
你可以使用AOP来拦截对JPA实体的访问,并检查用户的权限。
6. 使用注解:JPA和Spring Security都支持使用注解来控制对实体的访问。
例如,你可以在实体上使用`Secured`或`RolesAllowed`注解来限制访问。
7. 自定义Repository方法:在Spring Data JPA中,你可以自定义Repository方法来加入额外的逻辑,如权限检查。
8. 审计和日志:实现数据权限控制时,还应该考虑审计和日志记录,以跟踪谁何时访问或修改了哪些数据。
权限系统设计五张表
权限系统设计五张表在进行权限系统设计时,一项十分重要的任务是设计适当的数据库表结构。
数据库表的设计决定了系统的灵活性、效率和数据的完整性。
本文将介绍一个权限系统的设计,包括五张表的设计和结构。
表一:用户表(User)该表用于存储系统中的用户信息。
它包含以下字段:1. 用户ID(UserID):用于唯一标识每个用户的ID。
2. 用户名(Username):用户的登录名。
3. 密码(Password):用户的密码,需要进行加密存储。
4. 姓名(Name):用户的真实姓名。
5. 邮箱(Email):用户的电子邮箱地址。
6. 手机号码(PhoneNumber):用户的手机号码。
表二:角色表(Role)角色表用于存储系统中的角色信息,该表包含以下字段:1. 角色ID(RoleID):用于唯一标识每个角色的ID。
2. 角色名称(RoleName):角色的名称,如管理员、普通用户等。
3. 角色描述(RoleDescription):对角色进行详细描述。
表三:权限表(Permission)权限表用于存储系统中的权限信息,该表包含以下字段:1. 权限ID(PermissionID):用于唯一标识每个权限的ID。
2. 权限名称(PermissionName):权限的名称,如查看、编辑等。
3. 权限描述(PermissionDescription):对权限进行详细描述。
表四:角色-权限关联表(RolePermission)角色-权限关联表用于记录角色和权限之间的关系,该表包含以下字段:1. 关联ID(ID):用于唯一标识每个角色-权限关联的ID。
2. 角色ID(RoleID):与角色表中的角色ID关联。
3. 权限ID(PermissionID):与权限表中的权限ID关联。
表五:用户-角色关联表(UserRole)用户-角色关联表用于记录用户和角色之间的关系,该表包含以下字段:1. 关联ID(ID):用于唯一标识每个用户-角色关联的ID。
java权限管理系统数据库设计
数据库
注:
right表中记录着系统中所有的权限,以及权限相关描述
rightcolumn表中记录着权限的分栏,系统运行时,左侧菜单提供了几块不同的功能,每一块就是一个分栏,每添加一个分栏,该表中的记录就会增加一条,相对应的,左侧菜单栏中也会新增加一个栏
RightRole表记录着权限所属的角色
sysRole表记录着角色的相关信息,每添加一个角色,这里的记录就会增加一条
UserRight表记录着用户所属的角色,由于一个用户可能同时属于多个角色,所以该表中关于某一个用户的记录可能有多条
sysUser表记录着所有用户的信息,每添加一个用户,该表就会增加一条记录。
权限系统设计
权限系统设计权限管理就是管理⽤户对于资源的操作,CRM(客户管理软件)基于⾓⾊操作权限来实现的,就是⽤户通过⾓⾊和权限来实现的。
⼀共涉及5张表三张主表user表(⽤户表)role表(⾓⾊表)module表(模块表,资源表)两张中间表user_role表(user,role中间表)role_module表(role,module中间表)1--创建⽤户表2create table users(3--主键4 id number(10) primary key,5--⽤户名6 username varchar2(100),7--密码8 password varchar2(100),9--地址10 address varchar2(100)11 );12--创建⾓⾊表13create table role(14--主键15 id number(10) primary key,16--⾓⾊名称17 name varchar2(100)18 );19--创建模块表20create table module(21--主键22 id number(10) primary key,23--模块名称24 name varchar2(100),25--模块级别26 level_ number(3),27--⽗模块id28 pid number(10),29--模块路径30 url varchar2(100)31 );32--创建⽤户⾓⾊中间表33create table user_role(34--⽤户表外键35 u_id number(10),36--⾓⾊表外键37 r_id number(10)38 );39--创建⾓⾊模块中间表40create table role_module(41--⾓⾊表外键42 r_id number(10),43--模块表外键44 m_id number(10)45 );46--往⽤户表插⼊数据47insert into users values(1,'zhangsan','123456','郑州');48insert into users values(2,'lisi','123456','郑州');49--往⾓⾊表插⼊数据50insert into role values(1,'普通⽤户');51insert into role values(2,'管理员');52--往模块表插⼊数据53insert into module values(1,'系统管理',1,null,null);54insert into module values(2,'订单管理',1,null,null);55insert into module values(3,'⽤户管理',2,1,'user/list.do');56insert into module values(4,'⾓⾊管理',2,1,'role/list.do');57insert into module values(5,'模块管理',2,1,'mod/list.do');58insert into module values(6,'出库单管理',2,2,'ckd/list.do');59insert into module values(7,'⼊库单管理',2,2,'rkd/list.do');60--为张三⽤户赋予管理员的⾓⾊,为李四赋予普通⽤户的⾓⾊61insert into user_role values(1,2);62insert into user_role values(2,1);63--让管理员可以看到所有的菜单普通⽤户只能看到订单管理下所有的菜单64insert into role_module values(2,1);65insert into role_module values(2,2);66insert into role_module values(2,3);67insert into role_module values(2,4);68insert into role_module values(2,5);69insert into role_module values(2,6);70insert into role_module values(2,7);71insert into role_module values(1,2);72insert into role_module values(1,6);73insert into role_module values(1,7);74select*from users;75select*from role;76select*from user_role;77select*from module;78select*from role_module;三、权限管理的步骤第⼀步,⽤户登陆成功之后,根据⽤户的id查询出⽤户所能操作的模块,模块⼀般包含两级。
JAVA权限管理系统数据库设计
JAVA权限管理系统数据库设计在设计JAVA权限管理系统的数据库时,需要考虑到权限管理的基本需求,包括用户管理、角色管理、权限管理及相关关系的存储和管理。
首先,数据库的设计需要考虑用户管理,该模块用于存储和管理用户的基本信息,如用户ID、用户名、密码等。
用户表可以设计为以下字段:- 用户ID(User ID)- 用户名(Username)- 密码(Password)- 手机号(Phone Number)用户表中的用户ID是主键,用于唯一标识每一个用户。
接下来,数据库的设计需要考虑角色管理,该模块用于存储和管理角色的基本信息。
角色表可以设计为以下字段:- 角色ID(Role ID)- 角色名称(Role Name)角色表中的角色ID是主键,用于唯一标识每一个角色。
权限管理模块是权限管理系统的核心模块,用于存储和管理用户和角色之间的权限关系。
该模块可以设计为以下表结构:- 权限ID(Permission ID)- 权限名称(Permission Name)权限表中的权限ID是主键,用于唯一标识每一个权限。
接下来,需要设计用户和角色之间的关系,用户角色关系表可以设计为以下字段:- 关系ID(Relation ID)- 用户ID(User ID)- 角色ID(Role ID)用户角色关系表中的关系ID是主键,用于唯一标识每一个用户角色关系。
最后,在数据库设计中,需要考虑到不同模块之间的关联关系。
使用外键来定义表之间的关系,并添加必要的索引以提高系统性能。
综上所述,JAVA权限管理系统的数据库设计包括用户管理、角色管理、权限管理及相关关系的存储和管理。
通过合理设计数据库表结构和各表之间的关系,可以实现权限管理系统的基本功能,满足用户对权限的管理需求。
同时,为了提高系统性能,还需要考虑索引的设计和合理使用。
角色 菜单 表结构设计 java
角色菜单表结构设计java全文共四篇示例,供读者参考第一篇示例:角色菜单表结构设计在Java编程中起着重要作用,它是实现权限管理和用户角色管理的基础。
在一个系统中,通常会存在多种角色,每个角色对应不同的权限,而菜单则是用来展示不同权限下可操作的功能。
在设计角色菜单表结构时,需要考虑到系统的实际需求和多样性。
本文将探讨如何设计一个完整的角色菜单表结构,并使用Java语言实现。
一、角色菜单表结构设计1. 角色表(Role)角色表用来存储系统中定义的角色信息,每个角色对应一个或多个权限。
角色表的设计如下:角色ID(role_id):角色的唯一标识符,通常为一个整数值。
角色名称(role_name):角色的名称,用来描述角色的职能或身份。
备注(remark):对角色的描述信息。
创建时间(create_time):角色的创建时间。
更新时间(update_time):角色的更新时间。
2. 菜单表(Menu)关联ID(id):关联关系的唯一标识符,通常为一个整数值。
角色ID(role_id):关联的角色ID。
菜单ID(menu_id):关联的菜单ID。
4. 用户角色关联表(UserRole)根据上述设计原则,我们可以创建一个简单的角色菜单表结构示例,用来展示Java代码实现的逻辑。
具体定义如下:```@Entity@Table(name = "role")public class Role {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long roleId;private String roleName;private String remark;private Date createTime;private Date updateTime;// Getters and setters// toString method}```2. 菜单表(Menu)定义:以上是一个简单的角色菜单表结构设计示例,通过以上示例代码,我们可以在Java中实现角色菜单关联的逻辑。
数据库设计用户权限管理
数据库设计用户权限管理用户权限管理是指系统管理员通过对用户的权限进行管理和控制,确保用户只能在其所拥有的权限范围内进行操作。
数据库作为数据存储和管理的核心,对用户权限的管理尤为重要。
下面将详细介绍数据库设计用户权限管理的方法和步骤。
1.用户表设计首先,需要设计一个用户表,用于存储用户的基本信息。
用户表的字段包括用户ID、用户名、密码、角色ID等。
其中,角色ID是指用户所属的角色ID,通过角色来确定用户的权限范围。
2.角色表设计角色表用于存储系统中的角色信息。
角色是对用户权限进行细分和管理的方式,通过给用户分配不同的角色来确定其权限范围。
角色表的字段包括角色ID、角色名称、角色描述等。
3.权限表设计权限表用于存储系统中的权限信息。
权限是指用户可以进行的操作或者访问的资源。
权限表的字段包括权限ID、权限名称、权限描述等。
4.用户角色表设计用户角色表用于存储用户和角色之间的关联关系。
用户角色表的字段包括用户ID和角色ID。
5.角色权限表设计角色权限表用于存储角色和权限之间的关联关系。
角色权限表的字段包括角色ID和权限ID。
通过以上几步的设计,可以实现用户权限管理的基本功能。
下面介绍一些常见的操作和控制方式。
1.用户登录验证当用户登录系统时,需要验证用户输入的用户名和密码是否匹配。
可以通过查询用户表来进行验证,如果匹配成功,则表示用户身份验证通过,可以继续进行后续操作。
如果验证失败,则表示用户名或密码错误。
2.用户角色分配管理员可以通过用户角色表来为用户分配角色。
当用户被分配一个角色后,其权限范围将被限制在该角色所具备的权限范围内。
3.角色权限分配管理员可以通过角色权限表来为角色分配权限。
角色所具备的权限将在角色权限表中进行配置。
当一个角色被分配多个权限时,用户拥有该角色的权限将是这些权限的并集。
4.权限控制在系统运行时,需要根据用户的权限对其进行权限控制。
这可以通过查询用户角色表和角色权限表来实现。
当用户尝试进行一个操作或访问一个资源时,系统会先查询用户所具备的角色,再查询角色所具备的权限,最后判断用户是否具备进行该操作的权限。
java权限设计方案
java权限设计方案在Java中,权限设计方案是指在应用程序中对各种资源的访问进行控制和管理的方法。
一个好的权限设计方案能够保证系统的安全性和稳定性。
首先,权限设计方案需要确定系统中的各种资源,包括用户、角色、权限等。
用户是系统中的个体,角色是一组用户的集合,权限是用户或角色对资源进行操作的许可。
根据系统的需求和业务流程,确定系统中需要哪些资源以及它们之间的关系。
其次,权限设计方案需要建立用户与角色之间的关系。
通常,一个用户可以拥有多个角色,一个角色可以被多个用户拥有。
这样设计的好处是可以灵活地控制用户对资源的访问权限。
如果用户需要修改某个资源,只需要修改对应角色的权限即可,而不需要修改每个用户的权限。
接下来,权限设计方案需要定义不同角色的权限。
一个角色的权限可以包含多个资源的访问权限。
根据系统的需求和业务流程,确定每个角色可以访问的资源以及对资源的操作权限。
例如,一个管理员角色可能具有对所有资源的读写权限,而一个普通用户角色只能具有对部分资源的读权限。
权限设计方案还需要考虑细粒度的权限控制。
细粒度的权限控制指的是对每个资源的每个操作都进行权限的控制。
这样可以确保每个用户只能进行其具有权限的操作,有效地防止非法访问和数据泄漏。
例如,如果一个用户只具有对某个资源的读权限,那么他就无法对该资源进行删除操作。
此外,权限设计方案还需要考虑权限的继承和优先级。
继承指的是用户所属角色的权限可以继承给用户本身,优先级指的是用户拥有多个角色时,选择拥有最高优先级的角色的权限。
这样可以减少权限管理的工作量,提高用户的操作效率。
最后,权限设计方案需要实现相应的权限控制逻辑。
在Java 中,可以使用框架或自定义代码来实现权限的控制和管理。
常用的框架有Spring Security、Apache Shiro等。
这些框架提供了许多可用的注解、配置和工具类,可以简化权限管理的工作。
此外,也可以根据具体的业务需求,自定义代码来实现权限的控制逻辑。
用JAVA编写一个用户登陆界面用户验证通过数据库实现
用JAVA编写一个用户登陆界面用户验证通过数据库实现用户登录界面的实现可以分为以下几个步骤:1.用户界面设计2.数据库连接接下来,我们需要连接到数据库以验证用户的登录信息。
可以使用Java中的JDBC来连接数据库。
在连接数据库之前,需要准备好数据库的相关信息,如数据库驱动程序的引入、数据库连接URL、用户名和密码等。
3.用户验证一旦连接成功,我们可以使用SQL查询语句来验证用户的登录信息。
可以编写一个方法,传入用户输入的用户名和密码作为参数,并在数据库中查找是否存在匹配的用户记录。
可以使用PreparedStatement对象来执行SQL查询语句,查询结果将返回一个ResultSet对象。
4.处理验证结果根据查询结果,我们可以判断用户的登录是否成功。
如果有匹配的记录,则表示用户验证通过,可以跳转到下一个界面或执行其他操作。
如果没有匹配的记录,则表示用户验证失败,可以弹出错误提示框或执行其他错误处理逻辑。
5.关闭数据库连接在完成用户验证后,我们需要关闭数据库连接,释放相关资源。
可以在finally块中关闭连接,并通过try-catch-finally语句来确保连接的安全关闭。
以下是一个示例代码,用于实现用户登录界面的功能:```javaimport java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;public class UserLoginprivate static final String DB_URL ="jdbc:mysql://localhost:3306/mydatabase"; // 数据库连接URL private static final String DB_USER = "root"; // 数据库用户名public static void main(String[] args)//创建用户界面//用户界面设计略//监听登录按钮点击事件loginButton.setOnAction(event ->String username = usernameTextField.getText(;String password = passwordTextField.getText(;boolean result = validateUser(username, password);if (result)//用户验证通过,跳转到下一个界面或执行其他操作} else//用户验证失败,弹出错误提示框或执行其他错误处理逻辑}});}private static boolean validateUser(String username, String password)Connection conn = null;PreparedStatement stmt = null;ResultSet rs = null;boolean result = false;try//连接数据库conn = DriverManager.getConnection(DB_URL, DB_USER,DB_PASSWORD);//执行查询String sql = "SELECT * FROM users WHERE username = ? AND password = ?";stmt = conn.prepareStatement(sql);stmt.setString(1, username);stmt.setString(2, password);rs = stmt.executeQuery(;//判断查询结果if (rs.next()result = true; // 用户验证通过} elseresult = false; // 用户验证失败}} catch (SQLException e)//异常处理逻辑} finally//关闭连接和释放资源tryif (rs != null)rs.close(;}if (stmt != null)stmt.close(;}if (conn != null)conn.close(;}} catch (SQLException e)//异常处理逻辑}}return result;}```以上代码仅为示例,具体的实现可以根据自己的需求进行调整。
JAVA实现用户的权限管理
⼀:权限管理简介做系统时肯定遇到最常见的就是不同的⽤户的需求是不⼀样的,就拿登陆来说,⼀个办公管理系统,不同部门的⼈肯定要求的功能和权限都是不⼀样的,那你不可能对每⼀个部⼆:数据表的设计根据⾓⾊授权的思想,我们需要涉及五张表(简单⼀写,没写约束,凑活看吧)三:使⽤Shiro整合Spring进⾏管理权限四:Shiro在Web项⽬中的使⽤ 实战中shiro的应⽤很多,⼏乎都要⽤到,这⾥举⼀个Blog的登陆的例⼦,更好的理解和使⽤。
本博客是采⽤spring+springMVC+Mybatis实现的。
<P style="padding: 30px 0px 10px; position: relative;"><SPAN class="u_logo"></SPAN><INPUT id="userName" name="userName" class="ipt" type="text" placeholder="请输⼊⽤户名" value="${erName }"></P><P style="position: relative;"><SPAN class="p_logo"></SPAN><INPUT id="password" name="password" class="ipt" type="password" placeholder="请输⼊密码" value="${blogger.password }"></P><DIV style="height: 50px; line-height: 50px; margin-top: 30px; border-top-color: rgb(231, 231, 231); border-top-width: 1px; border-top-style: solid;"><P style="margin: 0px 35px 20px 45px;"><span><font color="red" id="error">${errorInfo }</font></span><SPAN style="float: right;"><input type="submit" style="background: rgb(0, 142, 173); padding: 7px 10px; border-radius: 4px; border: 1px solid rgb(26, 117, 152); border-image: none; color: rgb(255, 255, 255); font-weigh </SPAN></P></DIV></DIV></form>package com.xqc.controller;/*** 博主Controller层**/@Controller@RequestMapping("/blogger")public class BloggerController {@Resourceprivate BloggerService bloggerService;/*** ⽤户登录* @param blogger* @param request* @return*/@RequestMapping("/login")public String login(Blogger blogger,HttpServletRequest request){Subject subject=SecurityUtils.getSubject();UsernamePasswordToken token=new UsernamePasswordToken(blogger.getUserName(), CryptographyUtil.md5(blogger.getPassword(), "xqc"));try{subject.login(token); // 登录验证return "redirect:/admin/main.jsp";}catch(Exception e){e.printStackTrace();request.setAttribute("blogger", blogger);request.setAttribute("errorInfo", "⽤户名或密码错误!");return "login";}}}<!-- Shiro过滤器 --><bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"><!-- Shiro的核⼼安全接⼝,这个属性是必须的 --><property name="securityManager" ref="securityManager"/><!-- ⾝份认证失败,则跳转到登录页⾯的配置 --><property name="loginUrl" value="/login.jsp"/><!-- Shiro连接约束配置,即过滤链的定义 --><property name="filterChainDefinitions"><value>/login=anon/admin/**=authc</value></property></bean>package com.xqc.realm;import javax.annotation.Resource;import org.apache.shiro.SecurityUtils;import org.apache.shiro.authc.AuthenticationException;import org.apache.shiro.authc.AuthenticationInfo;import org.apache.shiro.authc.AuthenticationToken;import org.apache.shiro.authc.SimpleAuthenticationInfo;import org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.subject.PrincipalCollection;import com.xqc.entity.Blogger;import com.xqc.service.BloggerService;/*** ⾃定义Realm**/public class MyRealm extends AuthorizingRealm{@Resourceprivate BloggerService bloggerService;/*** 为当限前登录的⽤户授予⾓⾊和权*/@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {return null;}/*** 验证当前登录的⽤户*/@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { String userName=(String)token.getPrincipal();Blogger blogger=bloggerService.getByUserName(userName);if(blogger!=null){SecurityUtils.getSubject().getSession().setAttribute("currentUser", blogger); // 当前⽤户信息存到session中AuthenticationInfo authcInfo=new SimpleAuthenticationInfo(blogger.getUserName(),blogger.getPassword(),"xx"); return authcInfo;}else{return null;}}}package com.xqc.util;import org.apache.shiro.crypto.hash.Md5Hash;/*** 加密⼯具**/public class CryptographyUtil {/*** Md5加密* @param str* @param salt* @return*/public static String md5(String str,String salt){return new Md5Hash(str,salt).toString();}}分⾓⾊赋予不同的权利啦!分⾓⾊回显不同的信息啦!。
java 通用审批流程表设计
java 通用审批流程表设计Java 是一种跨平台、面向对象的编程语言,广泛应用于企业级应用程序的开发中。
为了支持各种业务流程的规范化、标准化处理,Java 通用审批流程表设计应运而生。
Java 通用审批流程表的设计需要满足以下要求:1. 数据库设计Java 通用审批流程表设计的第一步是数据库设计。
建议采用关系型数据库,通过建立多个表实现审批流程中的各个环节。
例如:- 用户表(user):存储用户的基本信息,如姓名、账号、密码等;- 角色表(role):存储用户所属的角色信息,如审批人、申请人等;- 审批流程表(process):存储审批流程的基本信息,如审批流程名称、审批节点信息等;- 审批节点表(node):存储审批节点的基本信息,如节点名称、节点编号、节点类型等;- 审批记录表(record):存储每一次审批记录的基本信息,如审批人、审批时间、审批状态等。
2. 业务逻辑Java 通用审批流程表设计的第二步是定义业务逻辑。
通常情况下,业务逻辑包括两个方面:流程控制和权限控制。
- 流程控制:通过定义审批节点、节点流转规则等方式实现审批流程的控制。
- 权限控制:通过定义用户角色、角色权限等方式实现业务流程中的权限控制。
3. 审批界面Java 通用审批流程表设计的第三步是定义审批界面。
通常情况下,审批界面需要具备以下功能:审批记录查询、审批操作、审批记录统计等。
- 审批记录查询:显示当前用户所需审批的审批记录信息。
- 审批操作:支持当前登录用户进行审批操作,如审批通过、审核不通过等。
- 审批记录统计:统计当前用户的审批记录信息。
4. 技术实现Java 通用审批流程表的技术实现应该采用流行的技术框架,如 Spring、Hibernate、Struts 等。
其中,Spring 负责业务逻辑处理和事务管理;Hibernate 负责数据存取操作;Struts 负责前端界面显示和请求响应。
总的来说,Java 通用审批流程表设计主要依托于数据库的建立和业务逻辑的定义,采用多张表之间的关联关系实现复杂的审批流程控制,并配合流行的技术框架实现界面交互。
java数据列权限设计思路
在Java中,设计数据列权限控制需要考虑以下几个步骤:
1.确定权限需求:首先,需要明确系统对数据列权限的需求。
例如,哪些用户需要访
问哪些数据列,以及他们需要执行哪些操作(如读取、修改、删除等)。
2.定义角色和权限:根据需求,定义不同的角色,并为每个角色分配相应的权限。
例
如,管理员角色可以拥有所有权限,而普通用户可能只拥有读取权限。
3.设计数据模型:在数据库中设计数据模型时,需要考虑权限控制的需求。
可以为数
据表添加一个权限字段,用于标识哪些用户可以访问该数据列。
4.实现数据层面的权限控制:在查询数据时,根据用户的角色和权限,对数据进行过
滤和限制。
例如,只有具有读取权限的用户才能查询到数据列的值。
5.业务逻辑层面的权限控制:在业务逻辑中,也需要对数据进行权限控制。
例如,在
更新数据时,需要检查用户是否具有修改权限。
6.界面层面的权限控制:在界面上,也需要根据用户的角色和权限来显示或隐藏相应
的数据列。
需要注意的是,数据列权限控制是一个复杂的过程,需要考虑多个方面。
因此,在实际开发中,建议采用成熟的框架或库来实现权限控制,如Spring Security、Shiro等。
这些框架提供了丰富的功能和灵活的配置选项,可以大大简化权限控制的设计和实现过程。
java数据权限设计思路
java数据权限设计思路Java数据权限设计思路在现代软件开发中,数据权限的管理变得越来越重要。
数据权限是指对系统中的数据进行访问和操作的权限控制。
合理的数据权限设计可以保护数据的安全性、完整性和机密性,同时也能提高系统的性能和效率。
本文将讨论Java数据权限设计的思路和方法。
1. 角色和权限的定义需要定义系统中的角色和权限。
角色是指用户在系统中扮演的角色,权限是指角色对数据的访问和操作权限。
可以根据系统的需求定义不同的角色,如管理员、普通用户、访客等,然后为每个角色分配相应的权限。
2. 数据层面的权限控制数据层面的权限控制是指对数据的访问和操作进行权限控制。
可以通过以下方法实现数据层面的权限控制:- 行级权限控制:对于某些敏感数据,可以定义行级权限,只有具有相应权限的用户才能访问或操作这些数据。
可以通过在数据库中添加权限字段,并在查询数据时进行权限过滤来实现行级权限控制。
- 列级权限控制:对于某些字段,可以定义列级权限,只有具有相应权限的用户才能看到或修改这些字段的值。
可以通过在数据模型中添加权限字段,并在业务逻辑中进行权限判断来实现列级权限控制。
- 数据屏蔽:对于某些敏感数据,可以进行数据屏蔽,只有具有相应权限的用户才能看到这些数据。
可以通过在查询数据时进行数据过滤来实现数据屏蔽。
3. 功能层面的权限控制功能层面的权限控制是指对系统中的功能进行权限控制。
可以通过以下方法实现功能层面的权限控制:- 页面级权限控制:对于某些页面,可以定义页面级权限,只有具有相应权限的用户才能访问或操作这些页面。
可以通过在前端代码中进行权限判断来实现页面级权限控制。
- 按钮级权限控制:对于某些按钮或操作,可以定义按钮级权限,只有具有相应权限的用户才能看到或使用这些按钮。
可以通过在前端代码中进行权限判断来实现按钮级权限控制。
4. 数据权限的动态管理数据权限的管理应该是动态的,即可以根据用户的角色和权限进行实时的控制和调整。
java数据权限设计方案
java数据权限设计方案数据权限是指系统根据用户的权限而对其所能访问或操作的数据进行控制和限制。
在Java中,可以通过以下方案来设计数据权限:1. 使用RBAC模型:RBAC(Role-Based Access Control)模型基于角色的访问控制,将用户分配给不同的角色,并将角色与数据权限进行关联。
在Java中,可以使用Spring Security框架实现RBAC模型,通过配置角色和权限的关系来实现数据权限的控制。
2. 使用动态SQL:动态SQL是指根据用户的权限动态生成SQL语句,从而实现对数据的访问控制。
在Java中,可以使用MyBatis框架来实现动态SQL,通过在SQL语句中加入判断条件,限制用户对数据的访问范围。
3. 使用注解和AOP:在Java中,可以使用注解和AOP (Aspect-Oriented Programming)来实现数据权限的控制。
通过在方法或类上添加注解,定义数据权限的范围和条件,然后使用AOP切面来拦截方法调用,并根据注解中的配置来判断用户是否有权限访问数据。
4. 使用数据库的行级别安全控制:某些数据库支持行级别安全控制(Row-Level Security),可以根据用户的角色或权限对表中的行进行控制。
在Java中,可以通过访问数据库的API 来实现对行级别安全控制的调用。
5. 使用缓存存储用户权限信息:将用户的权限信息缓存在内存或分布式缓存中,每次用户访问数据时,先从缓存中查询用户的权限,然后根据权限来过滤和限制数据的访问范围。
在Java中,可以使用Redis等缓存框架来实现用户权限的缓存。
总结起来,设计Java数据权限的方案可以使用RBAC模型、动态SQL、注解和AOP、数据库的行级别安全控制以及缓存存储用户权限信息等方法。
根据系统的需求和复杂程度,可以选择适合的方案来实现数据权限的控制和限制。
用户、角色和权限关系
⽤户、⾓⾊和权限关系⼀.引⾔因为做过的⼀些系统的权限管理的功能虽然在逐步完善,但总有些不尽⼈意的地⽅,总想抽个时间来更好的思考⼀下权限系统的设计。
权限系统⼀直以来是我们应⽤系统不可缺少的⼀个部分,若每个应⽤系统都重新对系统的权限进⾏设计,以满⾜不同系统⽤户的需求,将会浪费我们不少宝贵时间,所以花时间来设计⼀个相对通⽤的权限系统是很有意义的。
⼆.设计⽬标设计⼀个灵活、通⽤、⽅便的权限管理系统。
在这个系统中,我们需要对系统的所有资源进⾏权限控制,那么系统中的资源包括哪些呢?我们可以把这些资源简单概括为静态资源(功能操作、数据列)和动态资源(数据),也分别称为对象资源和数据资源,后者是我们在系统设计与实现中的叫法。
系统的⽬标就是对应⽤系统的所有对象资源和数据资源进⾏权限控制,⽐如应⽤系统的功能菜单、各个界⾯的按钮、数据显⽰的列以及各种⾏级数据进⾏权限的操控。
三.相关对象及其关系⼤概理清了⼀下权限系统的相关概念,如下所⽰:1. 权限系统的所有权限信息。
权限具有上下级关系,是⼀个树状的结构。
下⾯来看⼀个例⼦系统管理⽤户管理查看⽤户新增⽤户修改⽤户删除⽤户对于上⾯的每个权限,⼜存在两种情况,⼀个是只是可访问,另⼀种是可授权,例如对于“查看⽤户”这个权限,如果⽤户只被授予“可访问”,那么他就不能将他所具有的这个权限分配给其他⼈。
2. ⽤户应⽤系统的具体操作者,⽤户可以⾃⼰拥有权限信息,可以归属于0~n个⾓⾊,可属于0~n个组。
他的权限集是⾃⾝具有的权限、所属的各⾓⾊具有的权限、所属的各组具有的权限的合集。
它与权限、⾓⾊、组之间的关系都是n对n的关系。
3. ⾓⾊为了对许多拥有相似权限的⽤户进⾏分类管理,定义了⾓⾊的概念,例如系统管理员、管理员、⽤户、访客等⾓⾊。
⾓⾊具有上下级关系,可以形成树状视图,⽗级⾓⾊的权限是⾃⾝及它的所有⼦⾓⾊的权限的综合。
⽗级⾓⾊的⽤户、⽗级⾓⾊的组同理可推。
4. 组为了更好地管理⽤户,对⽤户进⾏分组归类,简称为⽤户分组。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实现业务系统中的用户权限管理
B/S系统中的权限比C/S中的更显的重要,C/S系统因为具有特殊的客户端,所以访问用户的权限检测可以通过客户端实现或通过客户端+服务器检测实现,而B/S中,浏览器是每一台计算机都已具备的,如果不建立一个完整的权限检测,那么一个“非法用户”很可能就能通过浏览器轻易访问到B/S系统中的所有功能。
因此B/S业务系统都需要有一个或多个权限系统来实现访问权限检测,让经过授权的用户可以正常合法的使用已授权功能,而对那些未经授权的“非法用户”将会将他们彻底的“拒之门外”。
下面就让我们一起了解一下如何设计可以满足大部分B/S系统中对用户功能权限控制的权限系统。
需求陈述
∙不同职责的人员,对于系统操作的权限应该是不同的。
优秀的业务系统,这是最基本的功能。
∙可以对“组”进行权限分配。
对于一个大企业的业务系统来说,如果要求管理员为其下员工逐一分配系统操作权限的话,是件耗时且不够方便的事情。
所以,系统中就提出了对“组”进行操作的概念,将权限一致的人员编入同一组,然后对该组进行权限分配。
∙权限管理系统应该是可扩展的。
它应该可以加入到任何带有权限管理功能的系统中。
就像是组件一样的可以被不断的重用,而不是每开发一套管理系统,就要针对权限管理部分进行重新开发。
∙满足业务系统中的功能权限。
传统业务系统中,存在着两种权限管理,其一是功能权限的管理,而另外一种则是资源权限的管理,在不同系统之间,功能权限是可以重用的,而资源权限则不能。
关于设计
借助NoahWeb的动作编程理念,在设计阶段,系统设计人员无须考虑程序结构的设计,而是从程序流程以及数据库结构开始入手。
为了实现需求,数据库的设计可谓及其重要,无论是“组”操作的概念,还是整套权限管理系统的重用性,都在于数据库的设计。
我们先来分析一下数据库结构:
首先,action表(以下简称为“权限表”),gorupmanager表(以下简称为“管理组表”),以及master表(以下简称为“人员表”),是三张实体表,它们依次记录着“权限”的信息,“管理组”的信息和“人员”的信息。
如下图:
这三个表之间的关系是多对多的,一个权限可能同时属于多个管理组,一个管理组中也可能同时包含多个权限。
同样的道理,一个人员可能同时属于多个管理组,而一个管理组中也可能同时包含多个人员。
如下图:
由于这三张表之间存在着多对多的关系,那么它们之间的交互,最好使用另外两张表来完成。
而这两张表起着映射的作用,分别是“actiongroup”表(以下简称“权限映射表”)和“mastergroup”表(以下简称“人员映射表”),前者映射了权限表与管理组表之间的交互。
后者映射了人员表与管理组表之间的交互。
如下图:
另外,还需要一张表来控制系统运行时左侧菜单中的权限分栏,也就是“权限分栏表”,如下图:
根据上面的分析,我们进行数据库结构设计,如下图:
为了能够进行良好的分析,我们将数据库结构图拆分开来,三张实体表的作用已经很清晰,现在我们来看一下两张映射表的作用。
一权限映射表如下图:
首先,我们来了解一下权限映射表与管理组表以及权限表之间的字段关联。
看图中的红圈,先看gorupid字段相关联,这种关联方式在实际数据库中的表现如下图:
如图中所示,管理组表中“超级管理员”的groupid为1,那么权限映射表中groupid为1的权限也就是“超级管理员”所拥有的权限。
使用groupid字段关联,是为了查到一个管理组能够执行的权限有哪些。
但这些权限的详细信息却是action字段关联所查询到的。
action字段相关联在数据库中的表现如下图:
通过这种关联,才查询到权限映射表之中那些权限的详细信息。
综合起来,我们就知道了一个管理组可以执行的权限有哪些,以及这些权限的详细信息是什么。
或许你会问,为什么不使用actionid字段相关联呢?因为:
∙权限表中的id字段在经过多次的数据库操作之后可能会发生更改。
∙权限映射表中仅仅记录着一个管理组可以执行的权限。
∙一旦权限表中的id更改,那么权限映射表中的记录也就更改了。
∙一个管理组可以执行的权限势必将出错,这是非常不希望的。
考虑到上面的情况,所以应该使用action字段相关联,因为:
∙在权限表中,id可能发生变化,而action字段却是在任何情况下也不可能发生变化的。
∙权限映射表中记录的action字段也就不会变。
∙一个管理组可以执行的权限就不会出错了。
二人员映射表如下图:
我们来了解一下人员映射表与管理组表以及人员表之间的字段关联,如下图:
看图中的红圈部分,先看groupid字段关联,这种关联方式在数据库中的表现如下图:
如图,“超级管理员”组的groupid为1,我们再看人员映射表,admin属于超级管理员组,
而administrator属于超级管理员组,同时也属于管理员组。
使用这种关联方式,是为了查到一个管理组中的人员有谁。
和上面一样,人员的详细信息是靠id字段(人员映射表中是masterid字段)关联查询到的。
id字段(人员映射表中是masterid字段)关联表现在数据库中的形式如下图:
一个人员可能同时属于多个“管理组”,如图中,administrator就同时属于两个“管理组”。
所以,在人员映射表中关于administrator的记录就会是两条。
这种关联方式才查询到管理组中人员的详细信息有哪些。
综合起来,才可以知道一个管理组中的人员有谁,以及这个人员的详细信息。
再结合上面谈到的权限表和权限映射表,就实现了需求中的“组”操作,如下图:
其实,管理组表中仅仅记录着组的基本信息,如名称,组id等等。
至于一个组中人员的详细信息,以及该组能够执行的权限的详细信息,都记录在人员表和权限表中。
两张映射表才真正记录着一个组有哪些人员,能够执行哪些权限。
通过两张映射表的衔接,三张实体表之间的交互才得以实现,从而完成了需求中提到的“组”操作。
我们再来看一下权限分栏表与权限表之间的交互。
这两张表之间的字段关联如下图:
两张表使用了actioncolumnid字段相关联,这种关联方式在数据库中的表现如下图:
如图所示,通过这种关联方式,我们可以非常清晰的看到权限表中的权限属于哪个分栏。
现在,数据库结构已经很清晰了,分配权限的功能以及“组”操作都已经实现。
下面我们再来分析一下需求中提到的关于权限管理系统的重用性问题。
为什么使用这种数据库设计方式搭建起来的系统可以重用呢?
∙三张实体表中记录着系统中的三个决定性元素。
“权限”,“组”和“人”。
而这三种元素可以任意添加,彼此之间不受影响。
无论是那种类型的业务系统,这三个决定性元素是不会变的,也就意味着结构上不会变,而变的仅仅是数据。
∙两张映射表中记录着三个元素之间的关系。
但这些关系完全是人为创建的,需要变化的时候,只是对数据库中的记录进行操作,无需改动结构。
∙权限分栏表中记录着系统使用时显示的分栏。
无论是要添加分栏,修改分栏还是减少
分栏,也只不过是操作记录而已。
综上所述,这样设计数据库,系统是完全可以重用的,并且经受得住“变更”考验的。
总结:
此套系统的重点在于,三张实体表牢牢地抓住了系统的核心成分,而两张映射表完美地映射出三张实体表之间的交互。
其难点在于,理解映射表的工作,它记录着关系,并且实现了“组”操作的概念。
而系统总体的设计是本着可以在不同的MIS系统中“重用”来满足不同系统的功能权限设置。
附录:
权限管理系统数据表的字段设计
下面我们来看看权限管理系统的数据库表设计,共分为六张表,如下图:
action表:
action表中记录着系统中所有的动作,以及动作相关描述。
actioncolumn表:
actioncolumn表中记录着动作的分栏,系统运行时,左侧菜单栏提供了几块不同的功能,每一块就是一个分栏,每添加一个分栏,该表中的记录就会增加一条,相对应的,左侧菜单栏中也会新增机一个栏。
actiongroup表:
actiongroup表记录着动作所在的组。
groupmanager表:
groupmanager表记录着管理组的相关信息,每添加一个管理组,这里的记录就会增加一条。
mastergroup表:
mastergroup表记录着管理员所在的管理组,由于一名管理员可能同同时属于多个组,所以该表中关于某一名管理员的记录可能有多条。
master表:
master表记录着所有管理员的信息,每添加一个管理员,该表就会增加一条记录。