Как построить модель данных для списка контроля доступа (ACL) - PullRequest
3 голосов
/ 10 ноября 2010

Совершенно очевидно, как смоделировать таблицу базы данных, которая будет действовать как список контроля доступа (ACL), когда вы имеете дело только с дискретными пользователями, которые имеют некоторый уровень доступа к дискретному ресурсу. Примерно так:

TABLE acl ( user_id INT, resource_id INT, access_type INT )

... где access_type - это число, представляющее что-то вроде:

0 (или отсутствие записи для user_id и resource_id) означает отсутствие доступа

1 означает только чтение

2 означает полный контроль

Однако становится сложнее, когда у вас есть сценарии, например, когда пользователи могут быть членами одной или нескольких групп, а группы могут содержать другие группы. Тогда ресурс может быть папкой, содержащей другие ресурсы.

Кроме явно плохого подхода к выполнению целой группы рекурсивных запросов во время выполнения для определения уровня доступа, который пользователь должен иметь к ресурсу, как эти сценарии имеют тенденцию обрабатываться? Существуют ли общепринятые проекты для моделирования ACL, подобного этому?

Ответы [ 2 ]

2 голосов
/ 10 ноября 2010

Используете ли вы БД с поддержкой connect by или что-то подобное? В oracle я реализовал следующее.

Table Group //Just the parent groups
{
    groupCode varchar
    groupDesc
}

Table groupMap //associates groups with other groups
{
    parentGroup
    childGroup
}

table userGroup //can assign user to more than one group
{
    userId
    groupCode
}

затем используйте connect by, чтобы получить все дочерние группы для пользователя

SELECT rm.CHILDGroup as roleCode
FROM groupMap rm
CONNECT BY PRIOR rm.CHILDGroup = rm.PARENTGroup
START WITH rm.CHILDGroup in
  (SELECT ur.groupCode
   FROM userGroup ur
   WHERE ur.userId = &userId);

Этот запрос получит все группы, которые были назначены пользователю в userGroup, и все дочерние группы, назначенные группам, к которым принадлежит пользователь.

0 голосов
/ 10 ноября 2010

Spring ACL - это надежная реализация ACL с наследованием для Java.Это открытый исходный код, поэтому я бы проверил, если это то, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...