Наше приложение должно проверять несколько бэкэндов для аутентификации и авторизации.
Для этой цели мы написали один модуль LoginModule для каждого бэкэнда, и теперь в итоге у вас есть несколько участников. Все идет нормально!
Приложение должно проверять пользовательские разрешения во время выполнения. Независимо от того, имеет ли руководитель это пользовательское разрешение, зависит от информации, взятой из конкретного бэкэнда. И здесь мы застряли с тех пор!
Мы выполнили наши собственные разрешения и использовали AccessController.checkPermission, чтобы проверить их. Но как сообщить JAAS действительно предоставленные разрешения? В LogModule нет ничего подобного, например Principal.setPermissions().
Интерфейсы Acl и Group выглядели перспективными в первую очередь, но отмечены устаревшими, поэтому должен быть другой способ. Но что?
Существует множество учебников о том, как писать файлы политики, но это точно не то, что нам нужно. Вместо этого нам нужно спросить бэкэнды о разрешениях директоров. И снова нам нужно использовать несколько бэкендов одновременно, и каждый бэкэнд знает только о своих собственных разрешениях, но не о том, разрешено ли конкретному коду открывать сокет или файл, поэтому исходная политика на основе файлов должна оставаться быть на месте.
Есть ли какой-либо эксперт JAAS, который может рассказать нам, что нам нужно реализовать, и как сообщить об этом JAAS во время выполнения?
Я не настоящий эксперт в JAAS, и я еще не пробовал ваше требование. Возможно, мои первые мысли полезны для вас.
javax.security.auth.SubjectDomainCombiner
с фактическим Subject
.java.security.Permissions
со всеми Permission
с java.security.Permissions
связан Principal
.java.security.ProtectionDomain#ProtectionDomain(CodeSource, PermissionCollection, ClassLoader, Principal[])
с java.security.ProtectionDomain#ProtectionDomain(CodeSource, PermissionCollection, ClassLoader, Principal[])
зависимости от вашего контекста. CodeSource
может быть null
а PermissionCollection
- экземпляром Permissions
созданным на шаге 2. Principal
массив - все связанные с Principal
с Permissions
.AccessControlContext
) и новый ProtectionDomain
через javax.security.auth.SubjectDomainCombiner#combine(ProtectionDomain[], ProtectionDomain[])
AccessControlContext
javax.security.auth.SubjectDomainCombiner#combine(ProtectionDomain[], ProtectionDomain[])
.java.security.AccessControlContext#AccessControlContext(AccessControlContext, DomainCombiner)
на основе текущего AccessControlContext
и SubjectDomainCombiner
AccessControlContext
используйте AccessControlContext
(шаг 4.) в следующем коде.
Надеюсь, что это помогает и работает.
Subject.doAs
иSubject.doAsPrivileged
. :) Кроме того, выборкаPermission
делегируется вPolicy
, которая отвечает на основеPrincipal
и / илиCodeSource
каждогоProtectionDomain
вAccessControlContext
.