回答

收藏

如何为访问控制列表(ACL)建立数据模型

技术问答 技术问答 225 人阅读 | 0 人回复 | 2023-09-14

当您只在与具有某种级别对离散资源访问权限的离散用户打交道时,如何为将充当访问控制列表(ACL)的数据库表建模是很明显的。像这样的东西:" D0 ?/ o. B: X4 X. `. G, t' k
TABLE acl ( user_id INT, resource_id INT, access_type INT )8 @, }" E4 O$ l" N7 B: ~" e( n
…其中access_type是一个表示类似以下内容的数字:
: r5 s( T5 `  L5 Z6 n3 A" |" e# w0(或缺少user_id和resource_id的记录)表示没有访问权限
- I' ^; k& T5 l1表示只读: _& @" p4 Z% f: A! ^7 Z. D0 v
2表示完全控制/ ^' A* n: x  n' }
但是,当您遇到这样的场景时,例如用户可以成为一个或多个组的成员,并且组可以包含其他组,则它变得越来越棘手。然后,资源可以是包含其他资源的文件夹。5 x  a, w8 J* g# |
除了在运行时执行一堆递归查询以确定用户对资源的访问级别这一明显差的方法之外,这些方案又将如何得到处理?是否有用于设计这样的ACL的通用设计?
, K; l  P- Z7 U4 E                ) J* X4 V! Y4 j* K; s5 T
解决方案:5 F: t5 p- M; {1 a) r+ M
                  h/ @' A8 E5 z2 }" D

2 M- c9 V6 m/ E% d6 u; u- ]8 `  A# a7 r* T
                您是否正在使用支持connect by或类似功能的数据库?在oracle中,我实现了以下内容。
4 w1 H1 E( }4 RTable Group //Just the parent groups
/ c& a8 |3 W5 B4 e$ N4 R* C{
+ a5 q+ D' d; C4 r% i+ x. b; N    groupCode varchar1 `9 P& m9 B# n
    groupDesc+ Q9 {! k7 K! i8 P/ E+ p
}# `$ z" o; ?: x9 Y7 C$ {, l1 F
Table groupMap //associates groups with other groups- g8 ?  O& _, b: Q; }3 x. K) D
{
7 N, h  ~  h: j7 U3 X0 N    parentGroup8 p+ j! d7 i% P, |+ W& k  j% q' V
    childGroup
3 v4 z$ p! J4 h. t; @1 t}
4 L) m$ s2 C8 Mtable userGroup //can assign user to more than one group
3 }  `- I6 N, h5 j9 Y5 }0 d{
: M8 f, P# a- Y' R3 e0 [# S* `: f    userId
+ A" [% ^' o2 w$ N8 i6 [: T    groupCode- @" b3 F; f; R
}; J) R# f7 b& F& P4 ^$ g3 E
然后用于connect by获取用户的所有子组& n( c' Y* `. D7 }6 h8 ?
SELECT rm.CHILDGroup as roleCode) t' {% L9 c4 @1 o0 B5 i
FROM groupMap rm0 P# O- P2 F" Y3 y- {
CONNECT BY PRIOR rm.CHILDGroup = rm.PARENTGroup" q& }5 F) F8 E- }- [
START WITH rm.CHILDGroup in
; i1 L7 r* S  L  k3 l0 S  (SELECT ur.groupCode# t+ N/ F6 G* c- \( R
   FROM userGroup ur
$ H2 y: h; z, k2 `: a- u   WHERE ur.userId = &userId);
/ g( Q$ @2 X* Y3 y' V2 _该查询将获取分配给用户的userGroup所有组以及分配给用户所属组的所有子组。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则