当前位置:首页 > 技术积累 > 正文内容

通用基础表逻辑设计(三)——功能权限

竹林之风5年前 (2019-07-23)技术积累3864

概述

        在一个应用系统中有多个用户,用户通常分为多种角色,每种角色的用户能够访问的页面、能够查看的数据或者能够执行的操作等各有不同,因此需要设计与实现应用系统的权限体系。通过对应用系统进行需求分析,由用例图可知功能需求,由E-R图可知数据需求,应用系统的权限就包括功能权限和数据权限。功能权限描述了一个用户或者一种角色能够访问哪些页面、能够执行哪些操作(按钮、链接等),数据权限描述了一个用户或者一种角色能够查看什么范围内的数据(水平范围内的记录)、能够查看数据的哪些属性(垂直范围内的字段)。本文仅讨论功能权限的设计与实现,从数据库层面尽量实现一种通用的功能权限体系。

        

部门、用户与角色

        在面向对象分析和设计中,通过用例图可以明确一个应该系统中有哪些用户、用户分哪些角色、用户属于哪个组织架构、各种用户或角色有哪些行为,通过E-R图来分析一个应用系统中的用户有哪些属性、用户与组织架构之间的关系、用户与角色之间的关系。1个用户属于1个部门,1个用户拥有1个或多个角色。用户属于哪个部门,则表示该用户只能查看与该部门关联的数据,这可以通过数据权限实现,也可以通过用户与部门之间的关联以及部门与其数据之间的关联推导出用户可查看哪些数据;用户拥有哪些角色,则表示该用户拥有这些角色赋予的权限。

图1:部门-用户-角色的E-R图


        部门、用户和角色各自包含哪些基本属性,则用以下表说明:


字段名称数据类型属性允许空默认值备注
u_idint(4)PK AI
用户编号
u_guidchar(36)
newid()用户GUID
d_guidvarchar(36)



所在部门GUID

u_account

varchar(50)

用户账号

u_pwdchar(32)

用户MD5密码
u_reg_timedatetime(8)
getdate()用户注册时间
u_reg_ipvarchar(50)

用户注册IP
u_last_timedatetime(8)


用户上次登录时间
u_last_ipvarchar(50)


用户上次登录IP
u_stateint(4)
0用户状态(-1已删除,0锁定,1正常),正常状态才能登录

表1:base_user用户表


字段名称数据类型属性允许空默认值备注
d_idint(4)PK AI
部门编号
d_guidchar(36)
newid()部门GUID

d_parent_guid

varchar(36)

上级部门GUID

d_namevarchar(50)

部门名称
d_stateint(4)
0部门状态(-1已删除,0已禁用,1已启用)

表2:base_department部门表


字段名称数据类型属性允许空默认值备注
r_idint(4)PK AI
角色编号
r_guidchar(36)
newid()角色GUID
r_namevarchar(50)

角色名称
r_stateint(4)
0角色状态(-1已删除,0已禁用,1已启用),已启用状态才有效

表3:base_role角色表


字段名称数据类型属性允许空默认值备注
ur_idint(4)PK AI
关联编号
u_guidchar(36)

用户GUID
r_guidchar(36)

角色GUID
ur_stateint(4)
0关联状态(-1已删除,0已禁用,1已启用),已启用状态才有效

表4:map_user_role用户与角色关联表


模块、操作与权限

        通过模块化设计一个应用系统,可以将系统划分为若干模块(Module:一个模块可以是一个页面、可以是一个控制器等等),每个模块包含各自的操作(Operation:一个操作可以是访问一个页面、可以是点击一个链接、可以是点击一个按钮、可以是点击一个菜单等等),一个模块的一个操作可以定义为最小粒度的权限(Power)。无论是通过点击链接或是按钮,都可以最终指向一个模块的一个操作。所有模块的通用操作我觉得基本上如下表所示:


操作编码操作名称操作说明
Add新增添加数据
Delete删除删除数据
Update修改编辑数据
List列表查询数据列表或访问列表页面
Get详情查询数据详情或访问详情页面
Import导入导入数据
Export导出导出数据
Pass审核审核或取消审核
Top推荐推荐或取消推荐

表5:操作列表


image.png

图2:模块-操作-权限E-R图


字段名称数据类型属性允许空默认值备注
m_idint(4)PK AI
模块编号
m_guidchar(36)
newid()模块GUID
m_parent_guidvarchar(36)

上级模块GUID
m_namevarchar(50)

模块名称
m_stateint(4)
0模块状态(-1已删除,0已禁用,1已启用),非已启用状态则该模块所有权限都无效

表6:base_module模块表


字段名称数据类型属性允许空默认值备注
op_idint(4)PK AI
操作编号
op_guidchar(36)
newid()操作GUID
op_namevarchar(50)

操作名称
op_stateint(4)
0操作状态(-1已删除,0已禁用,1已启用),非已启用状态则该操作所有权限都无效

表7:base_operation操作表


字段名称数据类型属性允许空默认值备注
p_idint(4)PK AI
权限编号
p_guidchar(36)
newid()权限GUID
m_guidchar(36)

模块GUID
op_guidchar(36)

操作GUID
p_namevarchar(50)

权限名称
p_loginint(4)
1是否登录(1要求登录,0无需登录)
p_validateint(4)
1是否验证(1验证权限,0开放权限)
p_stateint(4)
0权限状态(-1已删除,0已禁用,1已启用),非已启用状态则该权限无效

表8:base_power权限表


用户、角色与权限

        为各角色分配权限,则属于该角色的所有用户都将拥有这些权限。若一个用户还拥有所属角色之外的特殊权限,也可以单独为该用户分配权限,但为了统一规范权限体系,建议为这些特殊权限新建一个角色。一个用户的权限是其所属的所有角色的权限并集。


image.png

图3:角色-权限E-R图


字段名称数据类型属性允许空默认值备注
rp_idint(4)PK AI
关联编号
r_guidchar(36)

角色GUID
p_guidchar(36)

权限GUID
rp_stateint(4)
0关联状态(-1已删除,0已禁用,1已启用);用户创建子用户时,若要分配权限,则只能分配自身所属角色当前拥有的权限;自身角色权限有变动时,子用户角色相关权限联动改变

表9:map_role_power角色与权限关联表



综述

        配置部门->配置角色->分配权限->添加用户并设置所在部门和所属角色。在前后端分离项目中,一个业务接口为一个操作,一类接口为一个模块,比如ASP.NET MVC WebApi中,使用控制器名作为模块编码,使用方法名为操作编码。


image.png

图4:综合E-R图


image.png

图5:程序流程图

扫描二维码推送至手机访问。

版权声明:本文由久爱编程网发布,如需转载请注明出处。

本文链接:https://www.9icode.com/index.php/post/33.html

标签: 数据库
分享给朋友:

“通用基础表逻辑设计(三)——功能权限” 的相关文章

云平台多租户系统的设计方案

云平台多租户系统的设计方案

        多租户(Multi Tenancy)是指在一个云平台上,多个不同的客户共用相同的平台和架构但又相互独立并对各自的用户提供服务。多租户相同有4个特...

IIS中使用PHP-CGI报500错误问题可能原因

IIS中使用PHP-CGI报500错误问题可能原因

        在IIS中使用CGI方式运行PHP网站突然报500服务器错误,需要判断当前系统的软件环境有何变化去一一排查,通常可能的原因有:(1)PHP程序因...

ASP.NET中报“无法在已发送HTTP标头之后进行重定向”异常问题解决

ASP.NET中报“无法在已发送HTTP标头之后进行重定向”异常问题解决

        ASP.NET中报“无法在已发送HTTP标头之后进行重定向”异常时,其中一个原因是:在已经重定向后又重定向。在ASP.NET中实现重定向有以下几...

ASP.NET中报“无法在已发送HTTP标头之后设置状态”异常问题解决

ASP.NET中报“无法在已发送HTTP标头之后设置状态”异常问题解决

        ASP.NET中报“无法在已发送HTTP标头之后设置状态”异常,是因为设置Response的StatusCode之前,程序已设置响应标头。可从以...

ASP.NET网站自定义错误处理及其它安全相关

ASP.NET网站自定义错误处理及其它安全相关

        ASP.NET网站在运行过程中总是有可能报错,例如404等HTTP错误、500等程序异常。在IIS托管并报错的情况下,网站的默认行为依次是:(1).NET运行时接收并处理的部分显示.N...

从被扫描记录看网站安全应该注意的一些细节

从被扫描记录看网站安全应该注意的一些细节

1、尽可能地隐藏服务器真实IP,减少攻击目标。例如使用负载均衡、网关等作为门户,由负载均衡或网关转发到后端服务器。2、服务器必须开放的服务(除HTTP、HTTPS等为公众开放的服务外),尽可能改为其它较大的不常用的端口号,这样攻击者需要扫描...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。