Как запросить у внешнего бэкэнда разрешения?

1

Наше приложение должно проверять несколько бэкэндов для аутентификации и авторизации.

Для этой цели мы написали один модуль LoginModule для каждого бэкэнда, и теперь в итоге у вас есть несколько участников. Все идет нормально!

Приложение должно проверять пользовательские разрешения во время выполнения. Независимо от того, имеет ли руководитель это пользовательское разрешение, зависит от информации, взятой из конкретного бэкэнда. И здесь мы застряли с тех пор!

Мы выполнили наши собственные разрешения и использовали AccessController.checkPermission, чтобы проверить их. Но как сообщить JAAS действительно предоставленные разрешения? В LogModule нет ничего подобного, например Principal.setPermissions().

Интерфейсы Acl и Group выглядели перспективными в первую очередь, но отмечены устаревшими, поэтому должен быть другой способ. Но что?

Существует множество учебников о том, как писать файлы политики, но это точно не то, что нам нужно. Вместо этого нам нужно спросить бэкэнды о разрешениях директоров. И снова нам нужно использовать несколько бэкендов одновременно, и каждый бэкэнд знает только о своих собственных разрешениях, но не о том, разрешено ли конкретному коду открывать сокет или файл, поэтому исходная политика на основе файлов должна оставаться быть на месте.

Есть ли какой-либо эксперт JAAS, который может рассказать нам, что нам нужно реализовать, и как сообщить об этом JAAS во время выполнения?

Теги:
permissions
authorization
jaas

1 ответ

1

Я не настоящий эксперт в JAAS, и я еще не пробовал ваше требование. Возможно, мои первые мысли полезны для вас.

  1. Создайте javax.security.auth.SubjectDomainCombiner с фактическим Subject.
  2. Заполните новый java.security.Permissions со всеми Permission с java.security.Permissions связан Principal.
  3. Объединить разрешения и java.security.ProtectionDomain#ProtectionDomain(CodeSource, PermissionCollection, ClassLoader, Principal[]) с java.security.ProtectionDomain#ProtectionDomain(CodeSource, PermissionCollection, ClassLoader, Principal[]) зависимости от вашего контекста. CodeSource может быть null а PermissionCollection - экземпляром Permissions созданным на шаге 2. Principal массив - все связанные с Principal с Permissions.
  4. Объедините ток (из фактического AccessControlContext) и новый ProtectionDomain через javax.security.auth.SubjectDomainCombiner#combine(ProtectionDomain[], ProtectionDomain[]) AccessControlContext javax.security.auth.SubjectDomainCombiner#combine(ProtectionDomain[], ProtectionDomain[]).
  5. Создайте новый java.security.AccessControlContext#AccessControlContext(AccessControlContext, DomainCombiner) на основе текущего AccessControlContext и SubjectDomainCombiner

AccessControlContext используйте AccessControlContext (шаг 4.) в следующем коде.

Надеюсь, что это помогает и работает.

  • 0
    И это то, что уже делают методы Subject.doAs и Subject.doAsPrivileged . :) Кроме того, выборка Permission делегируется в Policy , которая отвечает на основе Principal и / или CodeSource каждого ProtectionDomain в AccessControlContext .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню