首先,对于这个问题有多长时间,我感到非常抱歉,感谢您的阅读时间!
我们目前正在开发我更喜欢描述为一个基于Web的平台,该平台中包含许多应用程序,并且遇到了权限问题。这是我们业务的内部应用程序,并且不公开,因此我们有独特的需求。
我们不能使用严格的基于组的权限系统,因为它过于笼统而又过于严格,一些员工将需要访问多个应用程序,应用程序中的多个部门(有些可能称为组),而每个部门中只有几个功能。
我们还需要能够动态显示数据,因为我们正在为该平台开发许多应用程序,因此我们需要能够在数据库中注册信息,然后它将填充适当的复选框并检查用户是否有权访问它们或者如果用户无权访问应用程序,部门或功能,请将其留空。
由于这些原因,我们需要3层权限,其中包括
用户可以访问的应用
用户可以访问的部门
用户有权使用的特定功能
从理论上讲,这应该非常简单,我相信最好的解决方案实际上会非常简单,但是我认为我们要么忽略某些内容,要么过于关注某些内容。
在继续进行之前,我了解到,在现有结构中,有很多方法可以解决这种情况,我们有6种方法可以正常运行和工作,但是这些方法使用的是“异常”方法,我们确实需要更好的解决方案,我相信这始于数据库设计。
我们目前尝试了3表系统,该系统具有以下与权限相关的表
应用程序注册:保存平台内所有应用程序的列表
app_id (primary AI) | perm_id (int) | app_name | app_code | app_location | tab_location | access_key
应用程序权限寄存器:保留每个应用程序的每个权限的列表,无论它是应用程序,部门还是职能(在下面的
access_type
下定义) permission_id (primary AI) | perm_id (int) | app_id | permission_code | permission_name | permission_description | access_type
特定用户权限:保留与应用程序,部门和功能相关的特定权限
permission_id (primary AI) | perm_id (varchar) | app_permission_id | app_id | user_id | access_status | function_code
问题在于分配权限,因为当我们进入功能级别时,我们发现mySQL查询需要太具体才能获取用户访问信息,而我们无法获取该部门的完整功能列表,
NULL
值将在LEFT JOIN
应在的位置返回-这归因于一个特定的字段,该字段在连接的多个表中具有通用名称,但每个表中的数据均不同。我们指定了要从每个查询返回的所有字段,但是由于某种原因,此1字段不断出现,并且连接了错误的数据。因此,我正在考虑实现以下结构:
应用程序注册:保存所有应用程序的列表以及URI和导航系统参考
app_id (primary AI) | app_name | app_uri | app_tab
部门登记册:保存所有部门的清单以及与申请的关系
dept_id (primary AI) | app_id | dept_name
职能注册:持有所有职能以及与部门的关系的列表,“部门注册”中的部门与申请有关
function_id (primary AI) | dept_id | function_name | function_description
特定的用户权限:持有用户可以执行的所有功能的列表,该列表与功能寄存器关联,该寄存器自身与部门寄存器关联,与应用程序寄存器关联
permission_id (primary AI) | user_id (index) | function_id | permission_status (int - 0 = not allowed access | 1 = allowed access)
编辑开始
我只是意识到,在特定的用户权限表上,上面显示的内容不太正确,我没有考虑到应用程序或部门权限,所以看起来如何?
我已将
function_id
更改为permit_item
来保存项目的ID,然后将其添加到permit_type
中以定义它是用户有权访问的应用程序,部门还是职能。 permission_id (primary AI) | user_id (index) | permit_item | permit_type | permission_status (int - 0 = not allowed access | 1 = allowed access)
编辑结束
例如,从这里我们可以在查询中进行一些联接(仅出于说明目的显示概念,我意识到这不是正确的查询,也不是在生产环境中编写此查询的最佳方法)
SELECT * FROM app_register
JOIN dept_register ON app.register.app_id=dept_register.app_id
JOIN function_register ON dept_register.dept_id=function_register.dept_id
JOIN user_permissions ON app_register.app_id=user_permissions.app_id
WHERE user_permissions.user_id='1'
这应该给我一个简化的联接权限表,该表将所有功能,部门和应用程序相关联,然后列出用户有权访问的应用程序。
但是我需要公正的观察者的投入,而不是情感投入的数据库设计师和他的朋友。
有什么我忽略或太看重的东西吗?
我们是否可以尝试使用另一个更好的结构来处理这些数据?
我真的很感谢大家的帮助,对于这个问题的时长,我再次表示抱歉!
最佳答案
您提出的解决方案对我来说似乎最有意义。
关于您LEFT JOIN
工作异常的问题,我建议您使用一种简单的技术。我们只需为每个表及其字段添加唯一值即可。例如,这些表:
苹果:[id,品牌,有机]
品牌:[id,名称]
会成为:
app_apples:[app_id,appbrd_brand,app_organic]
brd_brands:[brd_id,brd_name]
这完成了两件事。保证每个字段在整个系统中都是唯一的(因此应该解决所有JOIN
问题),并且还可以非常快速地查看和解决数据之间的关系。
只是我的两分钱。
关于mysql - 使用MySQL的3层Web应用程序权限结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9177335/