| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java EE (J2EE) и Spring > jboss+jaas+jsf |
| Автор: vectorrr 18.11.2008, 12:55 | ||||||||||
| Добрый день! появилась такая проблема как аутентификация и авторизация в jsf приложении. Как понял для этого необходим jaas, что бы поддерживать роли пользователей. Но вот с ним возникло гораздо больше проблем чем ожидал. У меня в базе для каждого пользователя проставляется роль, т.е после прохождения аутенфикации необходимо ограничить его доступ к некоторым ресурсам (администрирование, например). Пользователи не прошедшие аутентификацию так же имею доступ к небольшому набору ресурсов Набросал небольшой пример, но даже он не хочет работать в web.xml прописал следующее
как понял в jboss вместо файла конфигурации надо изменить login-config.xml в него добавил следующее
Написал свой CallbackHandler Как понимаю на него особой роли не возлагается, кроме как получения от пользователя введенных в форму логина и пароля?
сделал класс UserPrincipal
если правильно понял, то он используется как обертка для хранения различных единичных данных пользователя, будь то имя, роль и т.д? Далее идет LoginModule Как понимаю для jboss надо наследоваться от абстрактного класса AbstractServerLoginModule реализовал в нем абстрактные методы
Все это дело вызываю из бина, в методе осушествляющем логин LoginContext lc = new LoginContext ("auth", new CustomCallbackHandler("name", "password")); lc.login(); Оно валится в методе логин класса AbstractServerLoginModule Как понимаю, застопорился где-то вначале необходимой реализации всего этого добра. Если правильно понимаю, то именно в методе login() должно происходить подключение к базе и сравнение введенных логина и пароля с логином и паролем в базе? Т.е его нужно перегрузить тоже? А так же вопрос как правильно для пользователя должна устанавливаться роль? Если не сложно объясните кто-нибудь, пожалуйста, по шагам, что надо сделать, а то из всего что прочитал по этому поводу в итоге как оказалось ничего не помогло =) P.S. Прошу прощения за очень длинный пост =) |
| Автор: mbasil 18.11.2008, 13:20 | ||||
Как я понимаю логин модуль должен вызываться автоматически, если вы дополнительно создадите форму с названием formlogin.html типа:
А затем в дескрипторе развертывания опишите механизм аутентификации приложения и описание формы и страницы ошибок:
|
| Автор: vectorrr 18.11.2008, 13:30 |
| в том и дело что логин модуль вызвается и так, но аутентификацию не проходит основной вопрос в том, что в нем надо написать? как понял в методе login надо реализовать 1. подключение к базе и проверку, что совпадают логин и пароль. Если нет, то выбросить исключение 2. получить из базы роль пользователя (в случае успешности пункта 1) и куда-то ее установить. Вопрос куда? =) 3. что-то сделать в методе commit(). Тоже вопрос, что именно? Здесть устанавливается роль пользователя? Или я изначально не прав? |
| Автор: Evgeni68 18.11.2008, 18:53 | ||||||
Не проще ли воспользоваться готовым org.jboss.security.auth.spi.DatabaseServerLoginModule? т.е.
а так же в jboss-web.xml:
|
| Автор: mbasil 19.11.2008, 09:49 | ||||
| To Evgeni68 Проще, но хуже с точки зрения переносимости. И все же может быть проблема в методике инициирования аутентификации;
Сначала попробуйте инициировать аутентификацию, стандартным способом. Если не будет работать по прежнему то надо проверить вызываются ли ваши методы. Как я понимаю, это:
Вы взяли из какого-то примера JBosss? И getIdentity(), а также getRoleSets() должен вызывать сам их класс AbstractServerLoginModule. Вызывает ли, сделайте в этих методах простой вывод в журнал. Попробуйте получить текст класса AbstractServerLoginModule, например (это неприличное предложение), декомпиляцией. Сваяйте на основе этого текста свой класс (если удастся) и посмотрите, что в нем делается. |
| Автор: vectorrr 19.11.2008, 12:02 | ||
| Ну почему же неприличное предложение, по мне так вполне =) Сделал свой класс из AbstractServerLoginModule все так же валится в методе логин, как в методе initialize нужные параметры null
в passwordStacking получается null, из-за чего useFirstPass = false, поэтому login и не проходит пока что не понял что такое (String)options.get("password-stacking"); методы getIdentity(), getRoleSets() не вызывает потому, что до них просто не доходит Вообщем надо смотреть дальше, вдруг что получится =) |
| Автор: mbasil 19.11.2008, 14:53 | ||
Все же сидит в подсознании интуитивное предположение, что в результате этого:
сервер не получает "password-stacking". Проверьте базовой аутентификацией, это ведь делается легко. В конце концов вы можете нахально сунуть useFirstPass = true; вне всяких if'ов и посмотреть, что получится. |