Роли пользователей и разрешения пользователей с использованием apache shiro

Я пытаюсь смоделировать сложную систему управления разрешениями, используя apache shiro.

Английский не является моим родным языком. Я боюсь, что могу упустить некоторые тонкости таких терминов, как «Роли», «Разрешения», «Права» и «привилегии».

Например, допустим, я хочу создать систему, которая управляет такими ресурсами, как принтеры, расположенные внутри зданий. БД содержит информацию о том, какой принтер находится в каком здании. Пользователи этой системы должны иметь возможность перезагружать принтер или печатать на нем.

Мне ясно, что некоторые пользователи будут «суперадминистраторами» и смогут перезагружаться и печатать на любом принтере («принтер: *: *») — я думаю, мы могли бы сказать, что у этих людей есть «роль суперадминистратора».

Но что, если кому-то нужно разрешить сбрасывать принтеры в определенном здании («здание: A:*»)? Является ли «Администратор здания» (прараметрической) ролью? или это просто разрешение на конкретное здание? Как бы вы смоделировали это, используя apache Shiro?

nb
При пометке этого Q я добавил тег user-roles, и он говорит: «Роль пользователя — это группа пользователей, которые имеют одни и те же привилегии или разрешения в системе. Используйте этот тег для вопросов о том, как роли пользователей работают в системе. конкретная структура безопасности или вопросы о реализации пользовательских ролей в вашей программе».

Буду ли я прав, если предположу, что на основе этого определения не существует такой роли, как «Администратор здания», потому что администратор здания A не дает вам тех же разрешений, что и администратор здания B? и если да, то какая терминология будет правильной для описания «администратора здания»?


person epeleg    schedule 25.05.2016    source источник


Ответы (1)


Рассматривали ли вы возможность использования более трех токенов в формате WildCardPermission?

Количество токенов, которые можно использовать, не ограничено, поэтому все зависит от вашего воображения, как это можно использовать в вашем приложении.

WildCardPermission Javadoc

Вместо синтаксиса domain:action:instance, обычно используемого в примерах и документации Apache Shiro, вы можете добавить еще один токен для представления здания, например. printer:print,reset:*:buildingA.

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

// let's say the role for buildingA-admin has permission of "printer:*:*:buildingA"

subject.isPermitted("printer:print:epson123:buildingA"); // returns true
subject.isPermitted("printer:print:epson123"); // returns false

В зависимости от домена вашего приложения, возможно, такая структура, как buildingA:printer:print,reset:epson123, может быть даже более подходящей или полезной.


Чтобы ответить на ваш другой вопрос, касающийся ролей пользователей, вы правильно предположили, что если у вас есть роли buildingA-admin и buildingB-admin, это разные роли пользователей, если назначенные им разрешения не совпадают.
Вы можете создать общую роль пользователя Building Admin для разрешений, которые могут быть общими для всех администраторов разных зданий, чтобы избежать дублирования этих разрешений в разных ролях администраторов, относящихся к конкретному зданию.

person fspinnenhirn    schedule 26.05.2016
comment
Спасибо. Мне придется изучить этот вариант, поскольку я не уверен, каковы будут последствия для моего собственного домена. тем более, что в моем собственном домене принтеры можно перемещать между зданиями. - person epeleg; 26.05.2016