我有一个目录,其中包含可以包含目录的目录。目录的访问权限可以授予每个人,也可以限制为0到n个用户和/或0到n个用户组。访问权限在组的层次结构中以及从组到其用户继承。因此,用户可以访问目录,如果他被允许或(他不否认和(他的团体被允许或(他的团体不否认和(他的超级团体被允许或等等......
他们可以是1到n级别的群体,即使大部分时间,他们通常不超过3个级别。
我从架构中制作了一个sqlfiddle:http://sqlfiddle.com/#!2/81b28
我需要的是获取给定目录中可供给定用户访问的列表目录。
我到目前为止的内容如下:这将获取用户ID为'10'的目录ID'3'的内容,用户组'3'位于超级组'1'中:
select l.id, l.accessright, ll.parentlibrarydirectoryid, ulc.*, glc1.*, glc2.*
from librarydirectory l
inner join a_librarydirectory_librarydirectory ll on ll.childlibrarydirectoryid = l.id
left join a_user_librarydirectory_canaccess ulc on ulc.librarydirectoryid = l.id
left join ws_user u on u.id = ulc.userid
left join a_group_librarydirectory_canaccess glc1 on glc1.librarydirectoryid = l.id
left join a_group_librarydirectory_canaccess glc2 on glc2.librarydirectoryid = l.id
where
ll.parentlibrarydirectoryid = 3
and (u.id = 10 or u.id is null)
and (glc1.groupid = 3 or glc1.groupid is null)
and (glc2.groupid = 1 or glc2.groupid is null)
and (l.accessright = "n"
or ((ulc.canaccess = "y")
or (ulc.canaccess is null and (glc1.allowedToAccess = 1
or (glc1.allowedToAccess is null and (glc2.allowedToAccess = 1))))));
它正在工作,但我觉得这不是很优雅,因为我需要在动态构建查询之前查询数据库以获取组的层次结构,以便添加尽可能多的a_group_librarydirectory_canaccess join和where子句。小组层次结构。
有更聪明的方法吗?
感谢您的时间