Решения Spring Security / Java EE для ролей дерева иерархии

Я знаю, что Spring Security хорош для стандартной роли и авторизации на основе разрешений. Что я не уверен, так это сценарий:

В системе работают 10 000 сотрудников, а сотрудники организованы в организационную схему (дерево, в котором кто-то отчитывается по всем отделам). Некоторые из этих сотрудников являются пользователями. Этим пользователям разрешен доступ только к сотрудникам в пределах их ответственности (их ветвь в дереве / потомок их сотрудника).

Поэтому мне интересно, как современные системы Java EE (или другие) управляют этими проверками? Может ли Spring Security (ACL) сделать это и как это можно смоделировать?

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

 qtach10 июл. 2012 г., 05:02
да, мы можем, но проблема в том, как мы можем организовать роли в виде иерархического дерева?
 Matin Kh10 июл. 2012 г., 06:49
Фактически, это именно то, над чем я работаю!
 sathish_at_madison10 июл. 2012 г., 04:27
Можете ли вы добавлять роли пользователям, и Spring Security может работать на основе ролей?
 sathish_at_madison10 июл. 2012 г., 07:00
Не уверен, что Spring Security может многое сделать. Но вы можете проверить Apache Shiro, больше информации @shiro.apache.org, ура

Ответы на вопрос(2)

Когда мы говорим о Spring Security, Spring предоставляет две вещи. 1) Ролевое управление 2) ACL (разрешения на уровне домена) Я думаю, что вам здесь нужны разрешения на уровне домена.

Если вы планируете использовать управление ролями, создав соответствующую роль для каждого пользователя, данные могут увеличиться. Второй вариант - использование разрешений на уровне домена (Spring ACL), который является хорошей основой для авторизации во время выполнения. Вы можете использовать это для авторизации на основе аннотаций, но API-интерфейсы управления очень ограничены (BasicLookupStrategy), поэтому перед использованием изучите документацию.

Решение Вопроса

Поскольку я работаю над этим вопросом примерно месяц назад, я могу дать вам ответ на этот вопрос, однако, возможно, будет лучший ответ.
В Spring Security есть что-то вроде иерархии ролей, и если вы используете ROLE_A & gt; ROLE_B, то ROLE_A будет иметь все полномочия, которые есть у ROLE_B.
Итак, здесь есть два варианта:

1. Для каждого пользователя и его потомков есть пара ролей вроде. ROLE_USERi для пользователя и ROLE_USERiDESC для его потомков. У вас будет
ROLE_USERi > ROLE_USERiDESC
Но (поскольку я не знаю вашу организационную диаграмму) этого может быть недостаточно, поскольку таких пар может быть много! Это как-то подходит, если ваше дерево имеет два или три уровня (ROLE_USER имеет не более одного или двух восходящих элементов), потому что чем выше роль, тем больше у нее будет полномочий.

2. В моем проекте (который случайно очень похож) я сделал другую альтернативу. У меня есть некоторые основные роли для некоторых основных действий. И у меня есть «заботливая группа» в котором опекун может наблюдать данные своих потомков.
Why would I do that? Потому что у меня должны быть роли для некоторых действий (таких как редактирование, удаление, доступ к некоторым конфиденциальным данным и ...) и заботливые группы для наблюдения.
Если A является опекуном B, он может наблюдать данные B, но A не может делать ничего, кроме своих полномочий.

Кстати, он еще не полностью протестирован, и вы можете прийти к другому возможному решению.

Смотрите также:

Spring Security 3.1.x Documentation
 qtach10 июл. 2012 г., 08:34
Австралия, а ты? рад тебя видеть
 qtach10 июл. 2012 г., 07:34
Привет, Матин, спасибо за ответ. Ролевая иерархия действительно хороша для этой ситуации. Просто интересно как производительность, если есть много уровней деревьев? Также проект SaaS, иерархия должна быть настраиваемой для каждого клиента.
 10 июл. 2012 г., 07:41
Поскольку ролями можно управлять динамически, проблем с использованием Spring Security для вашего проекта не возникнет. Если ваше дерево имеет много уровней, может потребоваться много времени для назначения ролей. Но как только вы это сделаете, вы не будете беспокоиться о производительности. (просто интересно, ты из Австрии? ;-))

Ваш ответ на вопрос