使用mySQL的三层web应用权限结构

使用mySQL的三层web应用权限结构,mysql,web-applications,structure,Mysql,Web Applications,Structure,首先,我很抱歉这个问题问了这么长时间,感谢您花时间阅读 我们目前正在开发一个我更喜欢描述的基于web的平台,它包含许多应用程序,并且遇到了权限问题。这是我们业务的内部应用程序,不是公共的,因此我们有独特的需求 我们不能使用严格的基于组的权限系统,因为它太笼统,限制性太强,一些员工需要访问多个应用程序、应用程序中的多个部门(有些人可能称为组)以及每个部门中的少数功能 我们还需要能够动态显示数据,因为我们正在为平台开发许多应用程序。我们需要能够在数据库中注册信息,然后它将填充相应的复选框,并在用户有

首先,我很抱歉这个问题问了这么长时间,感谢您花时间阅读

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

我们不能使用严格的基于组的权限系统,因为它太笼统,限制性太强,一些员工需要访问多个应用程序、应用程序中的多个部门(有些人可能称为组)以及每个部门中的少数功能

我们还需要能够动态显示数据,因为我们正在为平台开发许多应用程序。我们需要能够在数据库中注册信息,然后它将填充相应的复选框,并在用户有访问权限时选中这些复选框,如果用户没有访问该应用程序的权限,则将其保留为空,部门或职能

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

  • 用户可以访问的应用程序
  • 用户可以访问的部门
  • 用户可以访问的特定功能
  • 理论上这应该是非常简单的,我相信最好的解决方案实际上是非常简单的,但我认为我们要么忽略了一些东西,要么过于仔细地观察了一些东西

    在我进一步讨论之前,我了解到在it现有结构中有许多方法可以处理这种情况,我们有6种方法可以正常运行和工作,但是这些方法使用的是“不寻常”的方法,我们确实需要更好的解决方案,我相信这从数据库设计开始

    我们目前已经尝试了一个3表系统,该系统具有以下与权限相关的表

    应用程序注册:它保存平台内所有应用程序的列表

        app_id (primary AI) | perm_id (int) | app_name | app_code | app_location | tab_location | access_key
    
    应用程序权限注册表:它保存每个应用程序的每个权限列表,无论它是应用程序、部门还是职能部门(在下面的
    访问类型下定义)

    特定用户权限:它拥有与应用程序、部门和职能相关的特定权限

        permission_id (primary AI) | perm_id (varchar) | app_permission_id | app_id | user_id | access_status | function_code
    
    分配权限时会出现问题,因为当我们进入功能级别时,我们发现mySQL查询需要太具体,才能获取用户访问信息,而我们无法获取该部门的完整功能列表,在
    左联接
    中没有返回任何
    NULL
    值,它们应该返回的位置-这是由于一个特定字段,该字段在多个被联接的表中有一个通用名称,但在每个表中有不同的数据。我们指定希望从每个查询返回的所有字段,但由于某些原因,这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
    
    功能注册:要保存所有功能的列表以及与部门的关系,“部门注册”中的部门与应用程序相关

        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\u id
    更改为
    permit\u item
    以保留项目的id,然后添加到
    permit\u type
    中,以定义用户是否有权访问该项目的应用程序、部门或职能

        permission_id (primary AI) | user_id (index) | permit_item | permit_type | permission_status (int - 0 = not allowed access | 1 = allowed access)
    
    编辑结束

    例如,从这里我们可以在一个查询中进行一些连接(只是为了演示这个概念,我意识到这不是正确的查询,也不是在生产环境中编写它的最佳方式)

    这将为我提供一个简化的联接权限表,该表关联所有功能、部门和应用程序,然后列出用户可以访问的应用程序

        permission_id (primary AI) | user_id (index) | permit_item | permit_type | permission_status (int - 0 = not allowed access | 1 = allowed access)
    
    但我需要公正的观察者的意见,而不是投入感情的数据库设计师和他的朋友

    有没有什么我忽略了或看得太重的东西

    有没有其他更好的结构,我们可以尝试,你可以想出处理这些数据


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

    你提出的解决方案对我来说似乎最有意义

    关于你的
    LEFT JOIN
    工作异常的问题,我建议你使用一种简单的技巧。我们只是在每个表及其字段前面加上唯一的值。例如,表:

    苹果:[标识、品牌、有机] 品牌:[身份证,姓名]

    将成为:

    苹果应用程序:[应用程序id,应用程序品牌,应用程序有机] brd_品牌:[brd_id,brd_名称]

    这可以完成两件事。每个字段保证在整个系统中都是唯一的(因此应该解决所有的
    JOIN
    问题),并且数据之间的关系也可以非常快速地查看和解决


    就我的两分钱。

    谢谢你的两分钱和小费@Donnie,小费很有道理,现在让我们看看我怎么能用它侮辱DB设计师!呵呵