Цикл иерархии в членстве, выяснение прав пользователя - PullRequest
0 голосов
/ 21 июля 2011

Я без ума от проблемы ниже.
Существуют пользователи и группы, и группы могут содержать как пользователей, так и другие группы:
CREATE TABLE GroupMembership (GroupMembershipID, GroupID, GroupTypeID, MemberID, MemberTypeID)
Поля GroupTypeID и MebmerTypeID необходимы для предоставления типов, поскольку у меня есть различные типы групп и членов.
Назовите меня Джимом, и у меня есть группа «Друзья Джима», в которую входят пользователи Боб, Джейн, а также группа «Друзья Джерри». В то же время у Джерри есть группа «Друзья Джерри», в которую входят Стив, Хлоя и «группа Джима». Как мы видим сейчас, между мной и Джерри есть петля. Все говорят, что петли в иерархиях - это ошибка. Как насчет моего дела? Есть ли способ избежать петли?

Теперь второй вопрос. У меня есть таблица Permission, которая описывает права доступа субъекта к определенным объектам:
CREATE TABLE Permission (PermissionID, SubjectID, SubjectTypeID, ObjectID, ObjectTypeID, PermissionTypeID, [Value])
Каждый субъект (пользователь, группа или что-то еще) имеет явное разрешение на определенный объект. В конечном итоге, чтобы выяснить права определенного пользователя на определенный объект, я должен отобразить дерево членства всех пользователей (через GroupMembership), затем присоединить его к разрешению и определить ближайшее (в иерархии GroupMembership) и наилучшее разрешение. 1015 * Похоже, это распространенный способ, не так ли?

Итак, в этой области мне нужно решить следующие задачи:
1) Узнайте разрешение пользователя на определенный объект
2) Узнайте все объекты, которые разрешены для определенного пользователя
3) Узнайте всех пользователей, которые имеют явные разрешения для определенного объекта
Похоже, это обычная задача, верно?

Сначала я хотел создать универсальное представление, которое представляет субъект, объект и фактическое разрешение для этого объекта (помните иерархию в GroupMembership!). Это позволило бы мне легко запросить его или присоединить к нему другие запросы. Я пытался сделать правильный SELECT в течение многих дней, но это было хорошо для одной задачи и очень плохо для другой (было полное сканирование и т. Д.). Та же ситуация, если я делаю функции. Теперь я все испортил :( Я не знаю, что это хороший способ решить эти задачи. Архитектура и задачи выглядят одинаково, но я не могу найти решения для подобных проблем в Интернете.
Не могли бы вы дать ссылки, советы или указать на мои ошибки?
Очень благодарен,
Джим.

1 Ответ

0 голосов
/ 21 июля 2011

Вы не можете сделать это в SQL.Группа в группе?Нет способа сгенерировать запрос, который может это пройти.Сделайте это вне SQL.

Вы можете создать: Группы: могут содержать пользователей (но не группы).Супергруппа: может содержать группы, но не супергруппы или пользователей.Это будет намного легче обрабатывать.

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

Подобная вам комбинация - это кошмар для SQL.

...