Как лучше всего адаптировать эту систему безопасности для работы с множественным наследованием? - PullRequest
9 голосов
/ 05 марта 2012

Привязайтесь, это сложный вопрос.

У нас есть система, которая работает с большими наборами данных.(от миллиона до миллиарда записей на одну таблицу).Все данные обрабатываются в древовидной структуре узлов.

Мы используем Symfony2 и систему безопасности Symfony2 (доменные объекты, Acls, Aces и т. Д.).Наше дерево Acl отражает наше дерево узлов.

Для обозначения некоторого языка:

  • DP Определенное разрешение, т.е. туз-запись на этом узле acl
  • EP Действующее разрешение, отсутствие записи аса, разрешение, унаследованное от родителя с DP

С точки зрения бизнес-логики, мы присваиваем 0 или 1 тузу для объекта на пользователя и полагаемся на наследование там, где естьникто.Root > lvl1 (DP: VIEW) > lvl2 > lvl3 (EP: VIEW)

Пока все хорошо.Это все работает.

Некоторые узлы не только имеют родителя, но и связаны с другими узлами (многие ко многим).Когда узел связан с другим узлом, это представляет отдельный путь вверх по дереву для отслеживания acls.То есть у нас было бы 1 или несколько путей вверх по дереву к корню для сбора туза.

Leaf < Parent < GrandParent < Root
Leaf < AssociatedNode < AssociatedNodeParent < AssociatedNodeGrandParent < Root
 ...

Или логика управления голосованием тузов в порядке, в чем мы не уверены, как представлять несколько путейвверх по дереву.Наши текущие (читай: плохие) идеи:

  • Множественное родительское поведение в дереве acl
    • Плюсы
      • Кажется чище?
    • Минусы
      • Почти вся перезапись системы безопасности, чтобы вставить это.
      • Потенциальный рацнестинг.
  • Дублирование идентификаторов объектов / acls для объектов, с указанием разных родителей.
    • Плюсы
      • Er ...
    • Минусы
      • Потенциально создаст очень большое количество записей acl.
      • Трудно управлять в коде.

Ответы [ 2 ]

1 голос
/ 27 мая 2013

Опять же, как уже отмечалось, это интересная, но нетривиальная проблема - спасибо! Теперь я знаю, как мне провести эти выходные :-) Я мог бы также рассмотреть идею кучи, но я бы превратил ее в кучу с резьбой. Каждый узел в куче содержит указатель на «индекс» ACL, если хотите.

Предположим, у меня есть только три узла в примере (R (oot), P (не) и N (ode)). Таким образом, ACL, установленный для N, представляет собой ACL (R) + ACL (P) + ACL (N). Предположим, что при создании узла этот узел содержит указатель X, который указывает на индекс узла. Итак, R (X) = ACLIndex (R). Ни один узел сам по себе не содержит свой ACL.

Теперь, для данного узла N, мне все равно придется гоняться от корня в худшем случае, но я просто прыгаю по плоскому индексу, чтобы сделать это, а не прыгаю по всему дереву. Было бы лучше, если бы вы могли утверждать, что для данного узла N существует только один путь к N, или, если существует несколько путей, N хранит другую таблицу обходов так, что для N путь (N) из узел A прослушивается в этой таблице. По сути, вы должны оставить крошки в N, когда к нему присоединяется узел.

Мне интересно, можем ли мы заимствовать понятие из геолокации. Для вашего маленького портативного GPS-приемника невозможно сохранить все возможные маршруты кратчайшего пути из любой точки в любую точку и помнить о времени движения. Он обманывает и разделяет карты на «плитки». Поскольку вы не можете быть на всей карте одновременно, а наоборот, вы ограничены плиткой, в которой находитесь в данный момент, ему нужно только вычислить кратчайшие пути изнутри. та плитка к ее известному существует. Как только вы выходите, он загружает этот тайл и повторяется. По сути, мы используем принцип локальности, чтобы уменьшить масштаб.

Что если бы мы использовали ту же идею? Для данного узла, если вы разделили дерево доступа на «сегменты», вы могли бы предварительно рассчитать затраты или, по крайней мере, обновить их, и тогда стоимость пути от R до N представляет собой просто сумму затрат на сегменты плюс стоимость пути в вашем местном осколке.

1 голос
/ 31 марта 2012

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

Самый простой способразрешить это можно было бы, чтобы гарантировать некоторую форму свойства heap , которое гарантирует, что каждый узел с тузом имеет большое или маленькое значение, которое может управлять обходом.Это сокращает время обхода с наихудшего случая O(n) (если вы искали каждый узел в индексе базы данных) до O(log n), когда вы проходите через сеть.

Причина получения O(1) обхода здесьТрудно, если ваш узел сети гарантирует возможность петельНо если вы строите график ACL, поддерживающий свойства, например, минимальной кучи, у вас все будет в порядке.

Удачи вам в вашей модели разрешений.

...