| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > Jaas |
| Автор: garbuz 6.1.2009, 18:14 | ||||||
| Начал читать книгу по jaas. Вместе с книгой идут исходники всех проектов из книги, которые запросто импортируются в эклипс. Все примеры запускаются из ant скрипта, каждый target запускает соответствующий пример. Так вот, дошел до первого простейшего примера, все запустил, все работает. Затем решил выдрать этот примерчик в отдельный проект. Вот тут и возникли проблемы. Вот сам код
Есть еще policy файл с пермишшенами
Запускаю из-под эклипса задав VM parameters, которые указаны в ant-скрипте.
Изменение файла policy ни к чему не приводит, хотя должно, я имею ввиду изменение "write" на "read", если такие изменения производить с файлом, который относится к проекту из книги, то там эти изменения действуют сразу. Такое чувство, что то-ли параметры не воспринимаются, то ли я где-то сильно затупил. Прошу помощи. |
| Автор: ivg 6.1.2009, 19:21 | ||||||
|
| Автор: garbuz 6.1.2009, 20:53 |
| ivg, спасибо большое! Все получилось! Тему не закрываю, боюсь, что еще будет не один вопрос |
| Автор: garbuz 12.1.2009, 17:39 | ||||||||||||||
Неспешно добрался до второго примера и тут тоже возникли непонятки. Так же как и раньше (см. выше) вынес приложение из общего в отдельное. Приложение уже больше похоже на приложение, тут используюстся LoginModule, CallbackHandler, Principals. Вот небольшое описание
Итак, что у нас есть. Main
наш CallbackHandler
SimpleLoginModule
Ну и два класса Principals, которые особой важности пока не имеют. Помимо этих классов существуеют так же два файла: 1) policy файл с правами доступа
2) Проперти файл для LoginContext
Короче как ни пытался запустить - ничего не вышло, кидает
Если запускать не из отдельно проекта, а из общего из книги через ant, то все равно такая же картина :( Возможно опять где-то что-то не усмотрел. Заранее спасибо! |
| Автор: ivg 12.1.2009, 21:30 | ||||||||||
1. Если содержимое policy файла, которое вы привели находится в файле C:/java/chapter2/chp02.policy, тогда аргументы для запуска JVM
2. Исправьте 12-ю строку policy файла на
3. Содержимое , у меня находится в файле ${user.home}/.java.login.config |
| Автор: ivg 13.1.2009, 00:39 |
Ну в таком случае остаётся лишь поправить 12-ю строку. |
| Автор: garbuz 13.1.2009, 01:16 | ||
Поправил на
тот же эксепшн |
| Автор: ivg 13.1.2009, 01:39 | ||
|
| Автор: garbuz 13.1.2009, 01:48 |
| ivg, приедешь в Питер, с меня ящик пива! Спасибо большое!!! |
| Автор: garbuz 13.1.2009, 19:48 |
| Пока не взялся за следующую главу книги, хочу выяснить некоторые вещи: 1) Если будет веб приложение, которое крутится на томкате, что лучше юзать для аутен\авторизац в приложении, встроенные стредства томката или jaas? 2) Насколько хороши встроенные стредства томката? Позволяет ли томкат использовать для авторизации бд, или же только свой tomcat-users.xml 3) В томкате аутен\авторизац только через ssl или же нет? 4) Короче в голове пока какая-то каша, может кто попробует разложить по полочкам? |
| Автор: ivg 14.1.2009, 00:05 |
http://tomcat.apache.org/tomcat-6.0-doc/realm-howto.html Нет. Просто, по хорошему, аутентификация должна проходить по защищённому соединению. |
| Автор: garbuz 14.1.2009, 00:31 |
| Пока еще по ссылке не прочитал. Хочу спросить еще Realm это совершенно отдельная часть от jaas? Если да, то в какую сторону лучше копать? Какие у кого преимущества? |
| Автор: garbuz 24.2.2009, 00:17 | ||||||||||
| Вот опять немного свободно времени выдалось, сел ковырять jaas дальше. Есть вопросы по LoginModule, в частности по методу commit() По имени пользователя создается credential - объект
Затем этот объект добавляется в объект subject к общим credentials.
Креденшинал объект, насколько я понял, это объект, содержащий идентифицирующие пользователя данные, например логин и пароль, ну или одно из них. Верно? или я ошибаюсь? Вопрос: для чего они нам дальше могут потребоваться? Дальше в этом методе получают объекты типа Principal, например такой
Потом набор этих principals добавляется в объект subject.
В чем смысл этих principals. Для чего они надо? В чем отличие от Credential? Короче в голове вообще какая-то каша! В доках томката в описании JAASRealm написано
так вот. Например у меня в базе три вида ролей, как я понимаю надо создать три разных principal - объекта , хотя это зачем непонятно. Различаться они будут только типом (классом) и значением поля name. А вот с principals для user вообще непонятно. Создавать такой же объект как и для роли, только название класса изменить на UserPrincipal? Что-то я вообще не догоняю. После всего этого как я понимаю, мне надо будет запустить томкат и в параметрах запуска указать конфиг файл, где указываю к какому приложению какой loginModule применять, верно? |
| Автор: garbuz 13.3.2009, 20:41 | ||||||||||||||||
Итак, опять я взялся ковырять jaas. Дописал для томката модуль аутентификации, опираясь на пример из книги, хотя книгу до конца еще не просмотрел. Вот что из этого вышло.
В конфигах томката
Аутентификация проходит нормально, все вроде бы работает. Однако у меня остались все те же вопросы. 1) Как мне использовать созданные Principals? 2) Надо ли их вообще использовать? 3) Как ограничивать какой-либо доступ куда-либо? Это делается с помощью описания policy файла как я понимаю? 4) Зачем это делать через policy, если это действеительно надо, если у меня все прописано в web.xml
5) Для чего нам нужет объек UsernameCredential? Как в дальнейшем и для чего его можно использовать? 6) Еще вопрос по поводу Prinsipals. Если например у меня несколько возможных ролей. Для каждой роли надо описывать соответствеющий Principal-класс и потом в policy для каждого principals описывать права доступа? Или же тут можно обойтись одним классом, и работать с полем name? Как в этом случае быть не с ролями, а с юзерами? 7) Был ли у кого-нибудь реальный опыт работы с jaas? Может кто ответит на мои вопросы 8) Может кто приведет свой реальный пример использования jaas? Заранее спасибо! |
| Автор: mbasil 17.3.2009, 14:19 |
| 1. Можно использовать декларативную безопасность в web контейнере так, как вы это описали в своем пункте 4 (то есть элемент <security-constraint>) 2. Можно продлить эту декларативную безопасность в EJB компоненты, описав каким ролям доступен вызов каких методов. 3. Можно использовать программную безопасность в web контейнере используя методы getUserPrincipal() isUserInRole() 4. Можно использовать программную безопасность в EJB контейнере используя методы getCallerPrincipal() isCallerInRole() (Первые два пункта предпочтительнее последних двух) |
| Автор: garbuz 17.3.2009, 14:36 | ||
| mbasil, ну EJB сразу откидываем, так как с EJB я практически не знаком. Будем говорить в контексте обычного веб-приложения. Почему декларативная безопасность предпочтительнее программной? Все ли можно описать в декларативной, что в программной? Взять например вот это:
Как это описать в декларативном виде? Не терям ли мы гибкость и удобство? |
| Автор: mbasil 17.3.2009, 16:16 |
| Конечно основные преимущества декларативной авторизации мы получаем именно в EJB, так как там мы имеем дело с хорошо гранулированным контролем доступа на уровне методов. В web контейнере речь идет о правах доступа к ресурсам, описываемым в web.xml. Это дает возможность управлять доступом к ресурсам WEB ПРИЛОЖЕНИЯ с использованием встроенных средств контейнера, причем после внесения изменений не всегда требуется даже повторно развертывать приложение. Иногда достаточно перезагрузить его. Приведенный вами пример скорее подходит для standalone приложения. Кроме того включение менеджера безопасности, которое обязательно надо будет сделать, чтобы это работало (по непонятным для меня причинам) резко снижает производительность даже простого standalone приложения. |
| Автор: garbuz 17.3.2009, 16:26 |
| mbasil, ясно, спасибо. Буду при возможности дальше курить книгу, уверен что еще отпишу в этой теме. |
| Автор: mbasil 17.3.2009, 16:39 |
| Лично мне JAAS нравится именно своей гибкостью и тем, что я могу отнять у контенера работу по аутентификации и авторизации и сделать это так, как мне нравится, например с хранением полномочий в базе данных или на LDAP сервере. Вы можете сказать, но ведь например, Tomcat тоже позволяет получать полномочия из базы данных. Да, но делает это в жестких рамках и при преносе приложения на другой сервер я опять должен это переделывать (включая таблицы базы и т.п.). Кроме того, вы можете использовать JAAS, например для аутентификации с помощью JavaCard или с контролем отпечатков пальцев. При использовании JAAS, принимая механизм аутентификации на себя, я результаты "подсовываю" контейнеру для выполнения декларативной авторизации и он это съедает. Очень удобно, на мой взгляд. |
| Автор: garbuz 17.3.2009, 19:48 | ||||||
Что вы имеете ввиду под полномочиями? Роли как я понимаю? Так как потом использовать все эти роли? Везде чекать isUrerInRole? Как вы делаете?
Ну да, роли хранятся в базе. Как-то можно обойтись без этих таблиц при переносе приложения?
Да, это конечно круто, достаточно лишь реализовать соответствующий LoginModule
Вот тут что-то не понял. Разве в случае с JDBCRealm и DataSourceRealm это не так же? |
| Автор: mbasil 17.3.2009, 20:15 | ||
| 1. Под полномочиями я понимаю то, что предполагает спецификация Java EE, а именно имена пользователей, пароли и роли. Но никто мне не мешает хранить в базе данных сертификаты и проверять их в своем LoginModule, а затем связывать их с ролями. 2. Поскольку имена пользователей, пароли и роли хранятся в моих собственных таблицах замене сервера приложений эта часть изменению не подлежит. При замене базы я просто выгружаю эту схему в SQL скрипт и загружаю в другую базу. 3. JDBCRealm и DataSourceRealm это за рамками спецификации "Java™ Platform, Enterprise Edition (Java EE) Specification, v5", а значит другие сервера приложений не обязаны именно так работать с аутентификацией в базе данных. И скорее всего они потребуют других названий таблиц и т.п. 4. Сегодня JAAS стандарт Java так я и предпочитаю пользоваться стандартным механизмом, который работает на всех серверах приложений. Добавлено через 5 минут и 17 секунд Что касается - как проверять, вы же сами приводили пример
В Web контейнере это основной декларативный способ - контроль доступности навигационных путей (ресурсов) с помощью ролей. Чекать isUrerInRole это очень редко, только там, где по другому нельзя. |
| Автор: garbuz 24.4.2009, 13:25 |
| У меня тут еще вопрос вылез, например у нас есть некая страничка, которая доступна и пользователю и администратору, однако если это администратор, то на страничке должен появиться дополнительный функционал, например для редактирования какой-нибудь например новости. Как это реализовать? Каждый раз в коде проверять isUserInRole в том месте где надо вставить кнопку для редактирования? Так? Или же есть более грамотный способ? |