表中每行的访问控制列表

时间:2013-12-31 23:19:35

标签: sql sql-server database-design acl

我在云上有一个任务表,我希望用户能够与他人分享他们的任务。我需要能够告诉哪些用户可以读取每个给定的行。

  • 我是否需要创建1到多个表来指定哪些用户有 访问给定的行?或者我可以使用json类型数据创建varchar列 指定用户?
  • 如果json专栏是可行的,会有很大的性能损失吗?
  • 如何查询此类表格?

谢谢。

2 个答案:

答案 0 :(得分:1)

它基本上归结为索引。您可以索引访问控制列表中的访问控制条目以进行有效查询吗?

如果您的表格如下:

create table task (
  id int primary key,
  subject varchar(255) not null,
  owner varchar(255) not null references some_user_table(name), --owner can has full permission on own record
  acl varchar(max) null
);

ACL可能如下所示:

[ {grantee:"public", read:true, write:false, grantor:"reverend"} ]

你如何索引这些值?在Posgres中,您可以索引JSON整个字段或单个JSON数组条目,但不能索引所有数组条目。我不太熟悉SQL Server中的XML索引,但是it exists

如果您的架构如下所示:

create table task (
  task_id int primary key,
  subject varchar(255) not null,
  owner varchar(255) not null --references some user table
);

create table task_acl (
  task_id int references task(task_id) on delete cascade,
  grantee varchar(255) not null, --the role getting the privilege
  privilege char(1) not null check (privilege in ('r', 'w', 't') ), --r=read, w=write, t=take ownership
  admin_option boolean not null default false, --whether grantee can grant privileges to others for this task
  grantor varchar(255) not null default current_user, --the role granting the privilege

  primary key (id, grantee, privilege)
);

然后至少你可以索引被授权者和特权字段。

您可以使用WHERE EXISTS子句查询此内容,以查看当前用户是否在ACL中。

答案 1 :(得分:0)

您可以使用视图在数据层内完成。