2012-02-07 65 views
1

首先,我非常抱歉这个问题有多长,并感谢您阅读它的时间!使用mySQL的三层web应用程序权限结构

我们目前正在开发我喜欢描述的基于Web的平台,该平台包含许多应用程序,并且遇到了权限问题。这是我们业务的内部应用程序,并未公开,因此我们有独特的需求。

我们不能使用严格的基于组的权限系统,因为它太笼统了,使得它太严格了,有些员工需要访问应用程序中的多个应用程序,多个部门(有些可能称为他们组)每个部门。

我们还需要能够动态显示数据,因为我们正在为我们需要能够在数据库中注册信息的平台开发许多应用程序,它将填充相应的复选框并检查它们是否为如果用户无权访问应用程序,部门或功能,则用户可以访问或保留它们。

出于这些原因,我们需要3层为包括

  1. 的应用程序权限的用户可以访问
  2. 部门的用户可以访问
  3. 特定功能的用户访问

从理论上讲,这应该非常简单,我相信最好的解决方案其实很简单,但我认为我们要么忽视某些东西,要么看得太紧ING。

我去任何进一步之前,据我所知,有许多的方式来处理这种情况在IT现有的结构,我们有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查询需要过于具体以便获取用户访问信息,并且我们无法获得该部门的完整功能列表,因此012xx中没有NULL值返回,他们应该在这里返回值 - 这归因于具有通用名称的特殊字段n多个表被连接,但每个表中的数据不同。我们指定了我们希望从每个查询返回的所有字段,但出于某种原因,这个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' 

这应该给我说,涉及所有职能,部门和应用程序,然后简化加入权限表最好的方式列出哪些应用程序的用户访问。

但是我需要公正的观察者的意见,而不是情绪投资的数据库设计师和他的朋友。

有什么我忽视或看得太辛苦了吗?

是否有另一个更好的结构,我们可以尝试,你可以想到处理这些数据?

我真的很感谢大家的帮助,对于这个问题的长度再次抱歉!

回答

0

您提出的解决方案似乎对我最有意义。

关于你的问题LEFT JOIN奇怪地工作,我可能会建议我们使用一种简单的技术。我们只需在每个表格及其字段前添加一个唯一值。例如,表:

苹果:[ID,品牌,有机] 品牌:[ID,名称]

将成为:

app_apples:[APP_ID,appbrd_brand,app_organic] brd_brands: [brd_id,brd_name]

这实现了两件事。每个字段保证在整个系统中都是唯一的(因此应该解决所有问题),并且数据之间的关系也可以很快看到和解决。

只是我的两分钱。

+0

感谢您的2美分和小费@Donnie,这个提示非常有意义,现在让我们来看看我可以如何侮辱数据库设计师!呵呵 – Ryan 2012-02-07 14:19:41