如何确定分层组织中的权限?

时间:2017-11-17 23:42:10

标签: postgresql permissions hierarchy

我正在尝试创建高性能逻辑,以确定层次结构组织中的权限。

员工被分配到一个或多个单位。单位是层次的(理论上)无限深度(实际上它不超过6层)。

例如,员工Jane可能是Supervisor单位的Accounts ReceivableAccounting单位的孩子),也可能是Member的{​​{1}} Ethics CommitteeCommittees的孩子,本身就是Office of the CEO的孩子。

作为Supervisor的{​​{1}},Accounts Receivable应该有权查看Jane中所有其他人的人事档案,但不能查看Accounts Receivable中的人事档案,因为她是Ethics Committee只是一个Member。同样地,Accounts Receivable单位的常规员工不应该能够查看彼此的个人资料,尽管他们都需要获得查看公司会计记录的许可。

我想这个数据库架构看起来像是:

| **employees** | **units**   | **positions** | **assignments** | **permissions** |
| ------------- | ----------- | ------------- | --------------- | --------------- |
| id            | id          | id            | employee_id     | unit_id         |
| name          | name        | title         | unit_id         | is_management   |
|               | parent_path | is_management | position_id     | ability         |

考虑到这一点,我如何编写一个高性能查询来确定JaneSam的{​​{1}},Accountant Accounts ReceivableBill之间的权限。 } {} Receptionist中的Office of the CEO

我最接近的是:

create function permissions(actor employees, subject employees) returns setof permissions as $$
begin
  for unit_id in select unit_id from assignments where employee_id = subject.id loop
    select permissions.name
    from assignments
    left join units on (unit.id = assignments.unit_id)
    left join positions on (positions.id = assignments.position_id)
    left join permissions on (
      permissions.unit_id = units.id
      and permissions.is_management = positions.is_management
    )
    where assignments.user_id = actor.id
      and (units.parent_path = unit_id or units.parent_path @> unit_id)
  end loop;
end;
$$ language plpgsql stable;

0 个答案:

没有答案