做着做着就会发现这样设计太过繁琐,如果公司里面所有员工都有这样的权限呢,每一个人都要配置?那是一件很痛苦的事情。因此再添加一个角色表,把某些人归为一类,然后再把权限分配给角色。角色属下的用户也就拥有了权限。
用户、角色之间的关系是一个用户可以对应多个角色,一个角色可以对应多个用户。多对多关系。
所以需要一个中间表,相信大家都很熟悉,自然不会有疑问。
应用场景
有了用户和角色以后,就需要设计应用场景,比如一个应用程序有几大模块(系统模块、项目管理模块、销售模块),
类似这样的模块就是一种应用场景,常见的还有 菜单 、 操作 等等。
假设现在我们设计好了,应用场景包括 模块、菜单、和操作,那么应该有以下六种关系
- 一个用户可以对应多个模块,一个模块可以对应多个用户。多对多关系。
- 一个用户可以对应多个菜单,一个菜单可以对应多个用户。多对多关系。
- 一个用户可以对应多个操作,一个操作可以对应多个用户。多对多关系。
- 一个角色可以对应多个模块,一个模块可以对应多个角色。多对多关系。
- 一个角色可以对应多个菜单,一个菜单可以对应多个角色。多对多关系。
- 一个角色可以对应多个操作,一个操作可以对应多个角色。多对多关系。
于是建立六张表来维护这六种关系。
这样设计看起来没什么问题。是的,如果没有加入新的关系的话,这样是已经可以满足大部分的需求了。可是如果就是如果,新的关系(需求)往往会加入到系统进来。这个时候就需要再建立一个新的表。系统的复杂度也随着增加。
可以看出,这样的设计有几个问题:
- 数据表设计太复杂
- 应对系统方案过于固定
三,把问题简单化
不同的应用场合,你可能会想出不同的需求,提了一个新的需求以后,可能会发现原来的设计没方法实现了,于是还要添加一个新的表。这也是上面所提到的问题。
其实不必想得那么复杂,权限可以简单描述为:
某某主体 在 某某领域 有 某某权限
1,主体可以是用户,可以是角色,也可以是一个部门
2, 领域可以是一个模块,可以是一个页面,也可以是页面上的按钮
3, 权限可以是“可见”,可以是“只读”,也可以是“可用”(如按钮可以点击)
其实就是Who、What、How的问题
因此上面所提到的六张表其实可以设计一张表:Privilege
四,实例说明
下面用一个例子做设计说明。“用户、角色在页面上的是使用权限”
详细设计:
1,把菜单的配置放在数据库上,每一个菜单对于一个唯一的编码MenuNo,每一个“叶节点”的菜单项对于一个页面(url)。
2,把按钮的配置放在数据库上,并归属于一个菜单项上(其实就是挂在某一个页面上)。应该一个页面可能会有几个按钮组,比如说有两个列表,这两个列表都需要有“增加、修改、删除”。所以需要增加一个按钮分组的字段来区分。
3, 把菜单权限分配给用户/角色,PrivilegeMaster为"User"或"Role",PrivilegeMasterValue为UserID或 RoleID,PrivilegeAccess为“Menu",PrivilegeAccessValue为 MenuNo,PrivilegeOperation为"enabled"
4,把按钮权限分配给用户/角 色,PrivilegeMaster为"User"或"Role",PrivilegeMasterValue为UserID或 RoleID,PrivilegeAccess为“Button",PrivilegeAccessValue为 BtnID,PrivilegeOperation为"enabled"
5,如果需要禁止单个用户的权限,PrivilegeOperation 设置为"disabled"。
如果不清楚的可以看下图:
数据库设计:
四,结语
说了这么多,其实我推荐的只是Privilege的表设计。这个表是who、what、how问题原型的设计。不仅扩展性、灵活性都很好,而且将复杂的权限管理系统浓缩成一句话。
而PrivilegeOperation不仅仅只是使用和禁止两种,包括分配权限、授权权限,都可以用这个字段定义。只是这无疑加大了应用程序的设计难度,但是对于表设计可以不做出任何的修改就可以完成,可以看出其灵活性。
比较偷懒的做法,遍历后台的控制器文件,得到路由列表,用户访问路由的时候比对。
/** * 获取所有可访问的action ** * @return array|bool */ public function getActionList() { $module_path = $_SERVER['DOCUMENT_ROOT'] . '/' . MODULE_PATH . 'Controller'; //控制器路径 if (!is_dir($module_path)) { return false; } $module_path .= '/*.class.php'; $ary_files = glob($module_path); $action_list = []; $exclude_controllers = $this->getExcludeControllers(); $exclude_methods = $this->getExcludeMethods(); foreach ($ary_files as $file) { if (is_dir($file)) { continue; } $controller = basename($file, C('DEFAULT_C_LAYER') . '.class.php'); if (in_array($controller, $exclude_controllers)) { continue; } $methods = get_class_methods(MODULE_NAME . '\\Controller\\' . $controller . C('DEFAULT_C_LAYER')); foreach ($methods as $k => $v) { if ((stripos($v, C('ACTION_SUFFIX')) === false)) { unset($methods[$k]); continue; } $action = str_replace(C('ACTION_SUFFIX'), '', $v); if (in_array($controller . '/' . $action, $exclude_methods)) { unset($methods[$k]); continue; } $methods[$k] = $action; } $action_list[$controller] = $methods; } return $action_list; } public function getExcludeControllers() { return ['Base', 'Login', 'Index']; } public function getExcludeMethods() { return ['AdminUser/logout', 'AdminUser/edit']; }
相关推荐
"通用权限管理系统设计篇"着重探讨了如何设计一个适用于多种场景、能够处理不同用户和角色权限的系统。在这个主题下,我们将深入理解权限管理的核心概念、设计原则以及实现策略。 一、权限管理基础 权限管理主要...
首先,标题“通用权限管理系统的设计与实现”直接指向了文章的主要内容,即设计并实现一个通用的权限管理系统。在IT行业中,权限管理系统(PMS)是确保应用程序安全的重要组成部分,它负责管理用户对系统资源的访问...
通用权限管理设计是构建复杂应用系统的关键组成部分,其目的是实现灵活、通用且易于管理的权限控制,以适应不同用户和场景的需求。权限管理涉及到多个核心概念,包括权限、用户、角色和组,它们之间有着复杂的关系。...
《通用权限管理概要设计说明书》V1.0是一份详细阐述权限管理系统的初步设计方案,旨在为系统开发提供基础架构和指导原则。本设计说明书涵盖了系统设计的目标、运行环境、网络结构以及模块化设计等多个方面。 1. **...
在《通用权限管理设计篇(二)》中,数据库设计是关键部分,包括数据表的设计规范、字段类型选择、索引策略以及数据校验规则等。合理的数据库设计能提升系统的性能和数据一致性。 《实现业务系统中的用户权限管理--...
二、通用权限管理系统功能 1. 用户管理:系统支持创建、修改和删除用户,以及分配和调整用户的权限。 2. 角色管理:通过角色来归类和管理用户权限,角色可以被赋予一系列权限,用户则通过关联角色获取相应的权限。 ...
通用权限管理模型在RBAC的基础上进行了扩展,通过引入资源、操作类型、功能等实体,使得功能权限更加丰富。模型还增加了数据权限的管理,使得系统可以更精确地控制用户对数据的访问。这种模型不仅能够处理功能权限,...
"通用权限管理系统Java权限处理及其实现思路" ...通用权限管理系统是B/S业务系统中非常重要的一部分,通过合理的设计和实现,可以满足业务系统中的功能权限控制,并且可以重用在任何带有权限管理功能的系统中。
《.NET 通用权限管理框架源码解析与应用》 在.NET开发领域,构建一个高效、灵活且易于维护的权限管理框架是项目开发中的重要环节。本文将详细解析一款名为".net 通用权限管理框架"的源码,帮助开发者理解和应用此...
在IT行业中,权限管理是系统安全的关键...总之,通用权限管理设计是一个系统工程,需要综合考虑业务需求、安全性和扩展性。通过合理的数据库结构和关联关系,我们可以构建出一个灵活、高效且易于维护的权限管理系统。
通用数据权限管理系统设计定义 本文提供了一种集成功能权限和数据权限的解决方法,以满足多层次组织中权限管理方面的集中控制。本方法是基于角色的访问控制方法(RBAC)的进一步扩展和延伸,即在功能权限的基础上...
通用权限管理系统通用权限管理系统通用权限管理系统通用权限管理系统通用权限管理系统通用权限管理系统通用权限管理系统
本文将深入探讨一个集成功能权限和数据权限的通用数据权限管理系统的设计思路及其核心组件。 #### 二、基础知识概述 **功能权限**:是指用户可以执行哪些具体的操作,例如创建订单、修改订单等。 **数据权限**:...
【通用权限管理系统源码】是基于ASP.NET技术开发的一个完整的权限管理解决方案,它主要用于帮助企业或组织构建具有精细权限控制的后台管理系统。ASP.NET是微软公司推出的一种强大的Web应用程序框架,它构建在.NET ...
【Winfrom通用权限管理系统】是一个基于C#编程语言和Winform框架开发的管理软件,它主要针对企业或组织内部的权限控制和管理需求。Winform框架是.NET Framework的一部分,提供了丰富的用户界面元素和事件处理机制,...
通用权限管理系统可练手可毕设,如果项目中有权限开发要求可直接拿来基础开发。...总的来说,基于SpringBoot+Vue的通用权限控制系统设计与实现,可以提供灵活、可扩展、易维护的权限控制功能,适用于各种应用
ASP.NET通用权限管理系统源代码(含文档、数据库) 1.菜单导航管理 2.操作按钮 3.角色管理 4.部门管理 5.用户管理(用户权限) 6.用户组管理(设置成员,用户组权限) 7.系统配置(动态配置系统参数) 8.附加属性...