![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Nobody |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 25.8.2003 Где: Россия, Москва Репутация: 4 Всего: 16 |
Вот приспичило мне организовать свою проверку пермишенов в веб-приложении. То есть я хочу по-прежнему пользоваться методами SecurityManager'а, но не на основе полиси, задаваемой в конфиг-файле, а на основе информации, хранящейся в БД. Самый простой способ, который я нашёл - написать свою реализацию для Policy.
1) Насколько это кошерно? 2) Каким боком ко всему этому относится java.security.acl.Acl? 3) Или я вообще пошёл не по тому пути и всё делается совсем не так? Смотрел как оно сделано в Оракле, там они действительно сделали свою реализацию Policy и хранят её в базе. Наверное так и сделаю. А Acl, как я понял, просто хранилище для удобного вытаскивания пермишенов для имеющегося принципала. crosspost http://community.livejournal.com/ru_java/249572.html -------------------- |
|||
|
||||
| tux |
|
||||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 31 Всего: 132 |
Вполне себе кошерно. Тоже приходилось такое реализовывать, только к конечном счете пришлось отказаться от JAAS.
ACL (Access Control List) - устоявшееся название для собрания разрешений, все правильно. У JAAS есть одно существенное ограничение. Система распределения доступа будет одна на всю JVM. А если есть несколько приложений, которые используют системы безопасности, основанные на JAAS, причем разные? В общем я бы к JAAS не привязывался или использовал систему безопасности сервера приложений, основанную на JAAS.
Что касается Acegi, я бы тоже рекомендовал. Права доступа можно реализовать на уровне конкретного объекта. |
||||
|
|||||
| Nobody |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 25.8.2003 Где: Россия, Москва Репутация: 4 Всего: 16 |
Не согласен. В JAAS'е есть Configuration, который можно передавать LoginContext'у в конструктор. И просто иметь раздельные конфигурейшены для разных приложений.
Смотрел. Чем это лучше вызывания методов у SecurityManager'а - не понял. -------------------- |
||||
|
|||||
| tux |
|
||||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 31 Всего: 132 |
Так-то оно так. Но вот Policy на всю JVM может быть одна (или я ошибаюсь?), по крайней мере я всегда был в этом уверен. И у меня была как раз такая ситуация когда одна библиотека распределения прав доступа использовала Policy, загружающий политики из XML, а вторая (собственноручно изготовленная) - из базы данных. Так и не придумал как же их совместить на одном сервере приложений, переделал систему безопасности.
Вообще говоря, JAAS - просто стандарт с весьма ограниченной в стандартной библиотеке функциональностью. Поэтому для более-менее серьезного контроля доступа придется писать многое самому. Другое дело те библиотеки, что реализованы в серверах приложений (JBoss, например). Хотя и для JBoss приходилось реализовывать надстройку для его библиотеки чтобы обеспечить доступ на уровне конкретных экземпляров объектов. В свою очередь, Acegi Security - вполне законченный продукт, не связанный с конкретным сервером приложений, умеющий работать со многими системами аутентификации. В том числе, в Acegi реализован и контроль доступа на уровне объекта. Вообще, внимательно на Acegi посмотрев и использовав в одном проекте не однаружил ничего такого, что мне может понадобиться и этого нет в библиотеке. Если не смущает использование в проекте Spring (Acegi с ним тесно связан), то я вижу у Acegi одни плюсы. |
||||
|
|||||
| Nobody |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 25.8.2003 Где: Россия, Москва Репутация: 4 Всего: 16 |
О блин. Да, про это я что-то не подумал.
Убедил. Спасибо за совет -------------------- |
||||
|
|||||
| Nobody |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 25.8.2003 Где: Россия, Москва Репутация: 4 Всего: 16 |
Возникла мысль. Да, полиси может быть только одна. Но! кто мешает сделать так чтобы полиси были завёрнуты одна в другую? Если внешняя запрещает, то она спрашивает у внутренней, если та тоже запрещает, то она спрашивает у ещё более внутренней и так далее.
Именно так я сейчас сделал с дефолтной полиси.
-------------------- |
||||
|
|||||
| tux |
|
|||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 31 Всего: 132 |
Ээээ... Дык она же и будет дефолтной, или я чего-то не понимаю?
Это сообщение отредактировал(а) tux - 18.6.2006, 14:37 |
|||
|
||||
| Nobody |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 25.8.2003 Где: Россия, Москва Репутация: 4 Всего: 16 |
Смотри: 1) Policy.getPolicy() возвращает дефолтную полиси. 2) Policy.setPolicy(new MyPolicy1(Policy.getPolicy())); теперь Policy.getPolicy возвращает MyPolicy1, внутри которой живёт дефолтная полиси. 3) Policy.setPolicy(new MyPolicy2(Policy.getPolicy())); теперь Policy.getPolicy возвращает MyPolicy2, внутри которой живёт MyPolicy1, внутри которой живёт дефолтная полиси. -------------------- |
|||
|
||||
| tux |
|
|||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 31 Всего: 132 |
Да, точно. Видно пора спать.
|
|||
|
||||
| Nobody |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 25.8.2003 Где: Россия, Москва Репутация: 4 Всего: 16 |
И ещё вопрос, точнее не вопрос, а просто хочу удостовериться что я всё правильно понимаю. Для выставления принципалов в текущий ProtectionDomain надо создать новый AccessControlContext, передав ему в качестве аргумента новый ProtectionDomain, который создан с нужными мне принципалами. И вызвать AccessController.doPrivileged(...) с полученным AccessControllerContext'ом. Я правильно всё понял?
Это сообщение отредактировал(а) Nobody - 18.6.2006, 14:53 -------------------- |
|||
|
||||
| tux |
|
|||
![]() Летатель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 31 Всего: 132 |
Судя по всему это должно сработать. У меня, правда, несколько иная схема - принципалы хранятся в Subject, а ProtectionDomain используется дефолтный. А вообще изучение собственных исходников полуторагодовой давности показало, что я уже почти ничего не помню.
Это сообщение отредактировал(а) tux - 18.6.2006, 15:42 |
|||
|
||||
| Nobody |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 25.8.2003 Где: Россия, Москва Репутация: 4 Всего: 16 |
tux, Можно и в Subject. Но в полиси передаются именно ProtectionDomain'ы. Хотя конечно можно на них забивать и вытаскивать Subject например из ThreadLocal'а. А потом вызывать у Acl'я метод checkPermission.
-------------------- |
|||
|
||||
![]()
|
| Правила форума "Java" | |
|
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |