Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SecurityManager, Acl, Policy, Permissions 
V
    Опции темы
Nobody
  Дата 17.6.2006, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 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 


--------------------
Алгоритм помещения вопросов на форуме
Выражаем спасибо вот ТАК
Use the Source, Luke!
PM MAIL WWW ICQ   Вверх
tux
Дата 17.6.2006, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 31
Всего: 132



Цитата(Nobody @  17.6.2006,  19:19 Найти цитируемый пост)
1) Насколько это кошерно?

Вполне себе кошерно. Тоже приходилось такое реализовывать, только к конечном счете пришлось отказаться от JAAS.

Цитата(Nobody @  17.6.2006,  19:19 Найти цитируемый пост)
Acl, как я понял, просто хранилище для удобного вытаскивания пермишенов для имеющегося принципала.

ACL (Access Control List) - устоявшееся название для собрания разрешений, все правильно.

Цитата(Nobody @  17.6.2006,  19:19 Найти цитируемый пост)
Или я вообще пошёл не по тому пути и всё делается совсем не так?

У JAAS есть одно существенное ограничение. Система распределения доступа будет одна на всю JVM. А если есть несколько приложений, которые используют системы безопасности, основанные на JAAS, причем разные? В общем я бы к JAAS не привязывался или использовал систему безопасности сервера приложений, основанную на JAAS. 

Цитата(Nobody @  17.6.2006,  19:19 Найти цитируемый пост)
crosspost http://community.livejournal.com/ru_java/249572.html  

Что касается Acegi, я бы тоже рекомендовал. Права доступа можно реализовать на уровне конкретного объекта.  
PM MAIL Skype GTalk Jabber YIM   Вверх
Nobody
  Дата 17.6.2006, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 25.8.2003
Где: Россия, Москва

Репутация: 4
Всего: 16



Цитата(tux @ 17.6.2006,  16:46)

У JAAS есть одно существенное ограничение. Система распределения доступа будет одна на всю JVM. А если есть несколько приложений, которые используют системы безопасности, основанные на JAAS, причем разные? В общем я бы к JAAS не привязывался или использовал систему безопасности сервера приложений, основанную на JAAS. 

Не согласен. В JAAS'е есть Configuration, который можно передавать LoginContext'у в конструктор. И просто иметь раздельные конфигурейшены для разных приложений.

Цитата(tux @ 17.6.2006,  16:46)
Что касается Acegi, я бы тоже рекомендовал. Права доступа можно реализовать на уровне конкретного объекта.

Смотрел. Чем это лучше вызывания методов у SecurityManager'а - не понял. 


--------------------
Алгоритм помещения вопросов на форуме
Выражаем спасибо вот ТАК
Use the Source, Luke!
PM MAIL WWW ICQ   Вверх
tux
Дата 18.6.2006, 06:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 31
Всего: 132



Цитата(Nobody @  17.6.2006,  22:21 Найти цитируемый пост)
Не согласен. В JAAS'е есть Configuration, который можно передавать LoginContext'у в конструктор. И просто иметь раздельные конфигурейшены для разных приложений.

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

Цитата(Nobody @  17.6.2006,  22:21 Найти цитируемый пост)
Смотрел. Чем это лучше вызывания методов у SecurityManager'а - не понял.  

Вообще говоря, JAAS - просто стандарт с весьма ограниченной в стандартной библиотеке функциональностью. Поэтому для более-менее серьезного контроля доступа придется писать многое самому. Другое дело те библиотеки, что реализованы в серверах приложений (JBoss, например). Хотя и для JBoss приходилось реализовывать надстройку для его библиотеки чтобы обеспечить доступ на уровне конкретных экземпляров объектов. В свою очередь, Acegi Security - вполне законченный продукт, не связанный с конкретным сервером приложений, умеющий работать со многими системами аутентификации. В том числе, в Acegi реализован и контроль доступа на уровне объекта. Вообще, внимательно на Acegi посмотрев и использовав в одном проекте не однаружил ничего такого, что мне может понадобиться и этого нет в библиотеке. Если не смущает использование в проекте Spring (Acegi с ним тесно связан), то я вижу у Acegi одни плюсы. 
PM MAIL Skype GTalk Jabber YIM   Вверх
Nobody
Дата 18.6.2006, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 25.8.2003
Где: Россия, Москва

Репутация: 4
Всего: 16



Цитата(tux @ 18.6.2006,  06:47)
Так-то оно так. Но вот Policy на всю JVM может быть одна (или я ошибаюсь?), по крайней мере я всегда был в этом уверен. И у меня была как раз такая ситуация когда одна библиотека распределения прав доступа использовала Policy, загружающий политики из XML, а вторая (собственноручно изготовленная) - из базы данных. Так и не придумал как же их совместить на одном сервере приложений, переделал систему безопасности.

О блин. Да, про это я что-то не подумал.

Цитата(tux @ 18.6.2006,  06:47)
Вообще, внимательно на Acegi посмотрев и использовав в одном проекте не однаружил ничего такого, что мне может понадобиться и этого нет в библиотеке. Если не смущает использование в проекте Spring (Acegi с ним тесно связан), то я вижу у Acegi одни плюсы.

Убедил. Спасибо за совет smile 


--------------------
Алгоритм помещения вопросов на форуме
Выражаем спасибо вот ТАК
Use the Source, Luke!
PM MAIL WWW ICQ   Вверх
Nobody
Дата 18.6.2006, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 25.8.2003
Где: Россия, Москва

Репутация: 4
Всего: 16



Возникла мысль. Да, полиси может быть только одна. Но! кто мешает сделать так чтобы полиси были завёрнуты одна в другую? Если внешняя запрещает, то она спрашивает у внутренней, если та тоже запрещает, то она спрашивает у ещё более внутренней и так далее.

Именно так я сейчас сделал с дефолтной полиси.

Код

Policy.setPolicy (new HeadhunterPolicy (Policy.getPolicy ()));


Код

public class HeadhunterPolicy extends Policy {

  private final Policy defaultPolicy;

  public HeadhunterPolicy (final Policy defaultPolicy) {
    this.defaultPolicy = defaultPolicy;
  }

  public boolean implies (ProtectionDomain domain, java.security.Permission permission) {
    if (текущая полиси не разрешает действие) {
      return defaultPolicy.implies (domain, permission);
    }
  }
}
 


--------------------
Алгоритм помещения вопросов на форуме
Выражаем спасибо вот ТАК
Use the Source, Luke!
PM MAIL WWW ICQ   Вверх
tux
Дата 18.6.2006, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 31
Всего: 132



Ээээ... Дык она же и будет дефолтной, или я чего-то не понимаю? smile 

Это сообщение отредактировал(а) tux - 18.6.2006, 14:37
PM MAIL Skype GTalk Jabber YIM   Вверх
Nobody
  Дата 18.6.2006, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 25.8.2003
Где: Россия, Москва

Репутация: 4
Всего: 16



Цитата(tux @ 18.6.2006,  14:32)
Ээээ... Дык она же и будет дефолтной, или я чего-то не понимаю? smile


Смотри:

1) Policy.getPolicy() возвращает дефолтную полиси.
2) Policy.setPolicy(new MyPolicy1(Policy.getPolicy())); теперь Policy.getPolicy возвращает MyPolicy1, внутри которой живёт дефолтная полиси.
3) Policy.setPolicy(new MyPolicy2(Policy.getPolicy())); теперь Policy.getPolicy возвращает MyPolicy2, внутри которой живёт MyPolicy1, внутри которой живёт дефолтная полиси. 


--------------------
Алгоритм помещения вопросов на форуме
Выражаем спасибо вот ТАК
Use the Source, Luke!
PM MAIL WWW ICQ   Вверх
tux
Дата 18.6.2006, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 31
Всего: 132



Да, точно. Видно пора спать. smile 
PM MAIL Skype GTalk Jabber YIM   Вверх
Nobody
Дата 18.6.2006, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 25.8.2003
Где: Россия, Москва

Репутация: 4
Всего: 16



И ещё вопрос, точнее не вопрос, а просто хочу удостовериться что я всё правильно понимаю. Для выставления принципалов в текущий ProtectionDomain надо создать новый AccessControlContext, передав ему в качестве аргумента новый ProtectionDomain, который создан с нужными мне принципалами. И вызвать AccessController.doPrivileged(...) с полученным AccessControllerContext'ом. Я правильно всё понял?  

Это сообщение отредактировал(а) Nobody - 18.6.2006, 14:53


--------------------
Алгоритм помещения вопросов на форуме
Выражаем спасибо вот ТАК
Use the Source, Luke!
PM MAIL WWW ICQ   Вверх
tux
Дата 18.6.2006, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Летатель
***


Профиль
Группа: Участник Клуба
Сообщений: 1853
Регистрация: 10.2.2005
Где: msk.ru

Репутация: 31
Всего: 132



Судя по всему это должно сработать. У меня, правда, несколько иная схема - принципалы хранятся в Subject, а ProtectionDomain используется дефолтный. А вообще изучение собственных исходников полуторагодовой давности показало, что я уже почти ничего не помню. smile 

Это сообщение отредактировал(а) tux - 18.6.2006, 15:42
PM MAIL Skype GTalk Jabber YIM   Вверх
Nobody
Дата 18.6.2006, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 25.8.2003
Где: Россия, Москва

Репутация: 4
Всего: 16



tux, Можно и в Subject. Но в полиси передаются именно ProtectionDomain'ы. Хотя конечно можно на них забивать и вытаскивать Subject например из ThreadLocal'а. А потом вызывать у Acl'я метод checkPermission. 


--------------------
Алгоритм помещения вопросов на форуме
Выражаем спасибо вот ТАК
Use the Source, Luke!
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1197 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.