0

在我的应用程序中,请求者有权仅查询某些列。请求者之间的列可能不同。where 子句在请求之间发生变化,因此返回的行随着每个查询而变化。处理此访问控制的最佳方法是什么?我应该使用数组来存储允许的列,然后在我的应用程序中进行检查吗?

我在 PostgreSQL 9.x

示例:我们有可以访问患者记录的医疗专业人员,但并非所有医疗专业人员都应该能够访问所有信息。他们试图请求有关任何患者(具有 uid)的任意信息,但我们应该强制执行访问控制。

所以说信息是姓名,出生日期,血型和疾病

医生 A 拥有所有字段的权限 医生 B 可以查看除血型以外的所有内容 管理员只能查看姓名和出生日期 血液科医生只能查看血型

4

2 回答 2

1

要实现选项 2,我将有一个列权限表,如下所示:

CREATE TABLE ColumnPerms
(
    user_or_role      Varchar(50),
    table_name        Varchar(50),
    column_name       Varchar(50),
)

CREATE INDEX ix_Columnperms(user_or_role, table_name)

*table_name* 列允许此功能在应用程序中的多个表上实现:如果没有必要,请不要使用它。您可以采用角色名称以“@”字符开头的约定,以确保不会与用户名发生冲突。

现在,当您构建动态查询时,您可以执行类似的操作

SELECT column_name 
  FROM ColumnPerms 
 WHERE user_or_role = '@manager'
   AND table = 'Payroll'
   AND column_name IN ('first_name', 'last_name', 'hire_date', 'base_salary', 'bonus')

(IN 子句应包括可能返回的每一列)。

此查询的结果是允许用户查看的列名列表。在构建动态 SQL 时,只需遍历它即可构建列列表。

于 2013-07-10T01:57:57.673 回答
0

您可以采取两种方法:

  1. 使用 Postgres 使用每个用户(或用户角色)的列级别权限来强制执行安全性。在此处查看 GRANT 的语法: http ://www.postgresql.org/docs/current/static/sql-grant.html

  2. 构建动态 sql 语句,限制可以为每个用户返回的行。如果有许多用户或许多不同的列组合,这可能会变得非常乏味。您可能希望保留一个用户 ID 表和“可选”表、列名以用于构建查询语句。如果您希望将其推广到许多不同的查询,您可以在执行列过滤的表返回函数之上构建它们,或者恢复为选项 1。

对于选项 1,确保连接中使用的列是可选的...

于 2013-07-10T01:24:52.567 回答