AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 1732
Accepted
taudorf
taudorf
Asked: 2011-03-15 03:48:56 +0800 CST2011-03-15 03:48:56 +0800 CST 2011-03-15 03:48:56 +0800 CST

具有用户、角色和权限的数据库模型

  • 772

我有一个带有用户表和角色表的数据库模型。我想控制对多达 10 个不同元素的访问(权限)。可以将访问权限授予角色或单个用户。下面是用户、角色和项目的表定义:

CREATE TABLE users
(
  id serial NOT NULL PRIMARY KEY,
  username character varying UNIQUE,
  password character varying,
  first_name character varying,
  last_name character varying,
  ...
);

CREATE TABLE roles
(
  id serial NOT NULL PRIMARY KEY,
  name character varying NOT NULL,
  description character varying,
  ...
);

CREATE TABLE element_1
(
  id serial NOT NULL PRIMARY KEY,
  name character varying NOT NULL,
  description character varying,
  ...
);

...

现在我有两种不同的方式来设计权利。一个带有权限类型列的表或 10 个权限表 - 每个我想要控制访问的元素一个。

一个权限表与每个元素一个权限表的优缺点是什么?- 或者是更合适的方式来做到这一点?

database-design best-practices
  • 2 2 个回答
  • 118045 Views

2 个回答

  • Voted
  1. Best Answer
    garik
    2011-03-15T16:50:45+08:002011-03-15T16:50:45+08:00

    首先,您计划实施哪种类型的安全模型?基于角色的访问控制 (RBAC) 还是自主访问控制 (DAC)?

    RBAC 在基于角色的访问控制 (RBAC) 模型中,对资源的访问基于分配给用户的角色。在此模型中,管理员将用户分配给具有某些预定权利和特权的角色。由于用户与角色的关联,用户可以访问某些资源并执行特定任务。RBAC 也称为非自主访问控制。分配给用户的角色是集中管理的。

    DAC 在自主访问控制 (DAC) 模型中,对资源的访问基于用户的身份。通过将用户放置在与资源关联的访问控制列表 (ACL) 上,用户被授予对资源的权限。资源 ACL 上的条目称为访问控制条目 (ACE)。当用户(或组)是 DAC 模型中对象的所有者时,用户可以将权限授予其他用户和组。DAC 模型基于资源所有权。

    见源

    1)在 RBAC 中:您需要 ElementType 表来为角色分配权限(用户被分配给角色)。RBAC 定义:“这个角色/用户可以做什么”。管理员为角色分配权限,为角色分配权限,将用户分配给角色以访问资源。2) 在 DAC 中:用户和角色通过访问控制列表(所有权)对元素拥有权限。DAC 定义:“谁有权访问我的数据”。用户(所有者)授予拥有资源的权限。

    我建议这个数据模型的任何方式:

    CREATE TABLE ElementType
    (
        Id (PK)
        Name
        ...
    )
    
    CREATE TABLE ElementBase
    (
        Id (PK)
        Type (FK to ElementType)
        ...
    )
    

    (一对一关系)

    CREATE TABLE Element_A
    (
        Id (PK, FK to ElementBase)
        ...
    )
    
    CREATE TABLE Element_B
    (
        Id (PK, FK to ElementBase)
        ...
    )
    

    1)RBAC(多对多关系)

    CREATE TABLE ElementType_To_Role_Rights
    (
        RightId (PK)
        RoleId  (FK to Role)
        ElementTypeId (FK to ElementType)
        ...
    )
    

    2)DAC(多对多关系)

    CREATE TABLE ElementBase_To_Actor_Rights
    (
        RightId (PK)
        ElementBaseId (FK to ElementBase)
        ActorId (FK to Actor)
        ...
    )
    
    CREATE TABLE Actor
    (
        Id (PK)
        Name
    )
    
    CREATE TABLE User
    (
        Id (PK, FK to Actor)
        Password
        ...
    )
    
    CREATE TABLE Role
    (
        Id (PK, FK to Actor)
        ...
    )
    
    • 36
  2. Leigh Riffel
    2011-03-15T07:37:48+08:002011-03-15T07:37:48+08:00

    每个元素都有一个权限表,一旦您添加一个元素,您将需要添加一个表。这将增加应用程序维护。

    将所有内容放在一个表中的缺点是您可能会遇到扩展问题,但可以使用分区、物化视图和/或虚拟列来缓解这些问题。可能没有必要采取此类措施。

    至于表设计,如果这是在 Oracle 上,我可能会建议这样的事情:

    CREATE SEQUENCE UserRoleID;
    
    CREATE TABLE USERROLE 
    (
      USERID NUMBER(7) NOT NULL 
    , ROLEID NUMBER(7) NOT NULL 
    , CONSTRAINT USERROLE_PK PRIMARY KEY 
      (
        USERID 
      , ROLEID 
      )
      ENABLE 
    ) 
    ORGANIZATION INDEX;
    
    CREATE TABLE PERMISSIONS 
    (
      ID NUMBER(7) NOT NULL 
    , ELEMENTID NUMBER(7) NOT NULL 
    , CONSTRAINT USERROLE_PK PRIMARY KEY 
      (
        ID 
      , ELEMENTID 
      )
      ENABLE 
    ) 
    ORGANIZATION INDEX;
    

    包代码可以根据需要使用 UserRoleID 序列来填充 Users 表中的 Id 和 Roles 表中的 Id。然后,权限表可以将元素分配给角色,这些角色又分配给用户和/或将元素直接分配给用户。

    • 5

相关问题

  • Oracle 数据库的推荐 RAID 配置是什么?

  • 存储计算值或根据要求重新计算它们更好吗?[复制]

  • 存储与计算聚合值

  • 连接不同地理区域的数据库的最佳实践

  • 在数据仓库中实现多对多关系有哪些方法?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve