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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> jboss+jaas+jsf, аутентификация и авторизация 
:(
    Опции темы
vectorrr
Дата 18.11.2008, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 27.8.2007

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



Добрый день!
появилась такая проблема как аутентификация и авторизация в jsf приложении. Как понял для этого необходим jaas, что бы поддерживать роли пользователей. Но вот с ним возникло гораздо больше проблем чем ожидал. У меня в базе для каждого пользователя проставляется роль, т.е после прохождения аутенфикации необходимо ограничить его доступ к некоторым ресурсам (администрирование, например). Пользователи не прошедшие аутентификацию так же имею доступ к небольшому набору ресурсов
Набросал небольшой пример, но даже он не хочет работать

в web.xml прописал следующее
Код

<security-constraint>
        <display-name>AdminSecurity</display-name>
        <web-resource-collection>
            <web-resource-name>Admin</web-resource-name>
            <url-pattern>/jsf/admin/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>admin</role-name>
        </auth-constraint>
    </security-constraint>
    <security-role>        
        <role-name>admin</role-name>
    </security-role>


как понял в jboss вместо файла конфигурации надо изменить login-config.xml
в него добавил следующее
Код

<application-policy name="auth">
  <authentication>
    <login-module code="ru.project.secutiry.CustomLoginModule " flag="required">
    </login-module>
  </authentication>
</application-policy>


Написал свой CallbackHandler Как понимаю на него особой роли не возлагается, кроме как получения от пользователя введенных в форму логина и пароля?
Код

import javax.security.auth.callback.*;
import java.io.IOException;

public class CustomCallbackHandler  implements CallbackHandler {

    private String userId;
    private String password;

    public IaCallbackHandler(String userId, String password){
        this.userId = userId;
        this.password = password;
    }
    
    public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
        for(int i = 0; i < callbacks.length; i++){
            if(callbacks[i] instanceof NameCallback){
                NameCallback ns = (NameCallback)callbacks[i];
                ns.setName(userId);
            } else if(callbacks[i] instanceof PasswordCallback){
                PasswordCallback pc = (PasswordCallback)callbacks[i];
                pc.setPassword(password.toCharArray());
            }
        }
    }
}



сделал класс UserPrincipal
Код

public class UserPrincipal implements Principal {

    public String name;

    public UserPrincipal(String name){
        this.name = name;
    }
    public String getName() {
        return name;
    }
}

если правильно понял, то он используется как обертка для хранения различных единичных данных пользователя, будь то имя, роль и т.д?

Далее идет LoginModule Как понимаю для jboss надо наследоваться от абстрактного класса AbstractServerLoginModule 
реализовал в нем абстрактные методы
Код


import org.jboss.security.auth.spi.AbstractServerLoginModule;
import java.security.acl.Group;
import java.util.*;

public class CustomLoginModule extends AbstractServerLoginModule {

    protected Principal getIdentity() {      
        return new UserPrincipal("admin");
    }

    protected Group[] getRoleSets() throws LoginException {        
        Set s = new HashSet();
        Group roleGroup = createGroup("Roles", s);
        roleGroup.addMember(new UserPrincipal("admin"));
        Group [] groups = {roleGroup};
        return groups;
    }   

}


Все это дело вызываю из бина, в методе осушествляющем логин

LoginContext lc = new LoginContext ("auth", new CustomCallbackHandler("name", "password"));
lc.login();

Оно валится в методе логин класса AbstractServerLoginModule 

Как понимаю, застопорился где-то вначале необходимой реализации всего этого добра. 
Если правильно понимаю, то именно в методе login() должно происходить подключение к базе и сравнение введенных логина и пароля с логином и паролем в базе? Т.е его нужно перегрузить тоже? А так же вопрос как правильно для пользователя должна устанавливаться роль?
Если не сложно объясните кто-нибудь, пожалуйста, по шагам, что надо сделать, а то из всего что прочитал по этому поводу в итоге как оказалось ничего не помогло =)

P.S. Прошу прощения за очень длинный пост =)



PM MAIL   Вверх
mbasil
Дата 18.11.2008, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 9
Всего: 13



Как я понимаю логин модуль должен вызываться автоматически, если вы дополнительно создадите форму с названием formlogin.html типа:
Код

<form method=”POST” action=”j_security_check”>
   <input type=”text” name=”j_username”>
   <input type=”password” name=”j_password”>
</form>

А затем  в дескрипторе развертывания опишите механизм аутентификации приложения и описание формы и страницы ошибок:
Код

<login-config>
   <auth-method>FORM</auth-method>
   <!--realm-name not required for FORM based authentication -->
   <form-login-config>
      <form-login-page>/formlogin.html</form-login-page>
      <form-error-page>/formerror.html</form-error-page>
   </form-login-config>
</login-config>

PM MAIL   Вверх
vectorrr
Дата 18.11.2008, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 27.8.2007

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



в том и дело что логин модуль вызвается и так, но аутентификацию не проходит

основной вопрос в том, что в нем надо написать?
как понял в методе login надо реализовать
1. подключение к базе и проверку, что совпадают логин и пароль. Если нет, то выбросить исключение
2. получить из базы роль пользователя (в случае успешности пункта 1) и куда-то ее установить. Вопрос куда? =)
3. что-то сделать в методе commit(). Тоже вопрос, что именно? Здесть устанавливается роль пользователя?

Или я изначально не прав?

PM MAIL   Вверх
Evgeni68
Дата 18.11.2008, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 9.7.2007

Репутация: 1
Всего: 3



Цитата(vectorrr @ 18.11.2008,  13:30)
1. подключение к базе и проверку, что совпадают логин и пароль.

Не проще ли воспользоваться готовым org.jboss.security.auth.spi.DatabaseServerLoginModule?
т.е.
Код

<policy>
    <application-policy name="auth">
        <authentication>
            <login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule"
                             flag="required">
                <module-option name="dsJndiName">java:/MyDatabaseDS</module-option>
                <module-option name="principalsQuery">
                    select passwd from Users username where username=?</module-option>
                <module-option name="rolesQuery">
                    select userRoles, 'Roles' from UserRoles where username=?</module-option>
            </login-module>
        </authentication>
    </application-policy>
</policy>


а так же в jboss-web.xml:

Код

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE jboss-web PUBLIC "-//JBoss//DTD Web Application 2.3//EN" "http://www.jboss.org/j2ee/dtd/jboss-web_4_0.dtd">
<jboss-web>
    <security-domain>java:/jaas/auth</security-domain>
    ...
</jboss-web>


Это сообщение отредактировал(а) Evgeni68 - 18.11.2008, 18:58
PM MAIL   Вверх
mbasil
Дата 19.11.2008, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 9
Всего: 13



To Evgeni68  Проще, но хуже с точки зрения переносимости.

И все же может быть проблема в методике инициирования аутентификации;
Код

LoginContext lc = new LoginContext ("auth", 
      new CustomCallbackHandler("name", "password"));
lc.login(); 

Сначала попробуйте инициировать аутентификацию, стандартным способом.

Если не будет работать по прежнему то надо проверить вызываются ли ваши методы.
Как я понимаю, это:
Код

import org.jboss.security.auth.spi.AbstractServerLoginModule;
import java.security.acl.Group;
import java.util.*;
public class CustomLoginModule extends AbstractServerLoginModule {
    protected Principal getIdentity() {      
        return new UserPrincipal("admin");
    }
    protected Group[] getRoleSets() throws LoginException {        
        Set s = new HashSet();
        Group roleGroup = createGroup("Roles", s);
        roleGroup.addMember(new UserPrincipal("admin"));
        Group [] groups = {roleGroup};
        return groups;
    }   
}

Вы взяли из какого-то примера JBosss?
И getIdentity(), а также getRoleSets() должен вызывать сам их класс AbstractServerLoginModule.
Вызывает ли, сделайте в этих методах простой вывод в журнал.

Попробуйте получить текст класса AbstractServerLoginModule, например (это неприличное предложение), декомпиляцией. Сваяйте на основе этого текста свой класс (если удастся) и посмотрите, что в нем делается. 

Это сообщение отредактировал(а) mbasil - 19.11.2008, 10:01
PM MAIL   Вверх
vectorrr
Дата 19.11.2008, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 27.8.2007

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



Ну почему же неприличное предложение, по мне так вполне =)

Сделал свой класс из AbstractServerLoginModule
все так же валится в методе логин, как в методе initialize нужные параметры null

Код

public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, Map options)
    {
        this.subject = subject;
        this.callbackHandler = callbackHandler;
        this.sharedState = sharedState;
        this.options = options;
        String passwordStacking = (String)options.get("password-stacking");
        if(passwordStacking != null && passwordStacking.equalsIgnoreCase("useFirstPass"))
            useFirstPass = true;
        principalClassName = (String)options.get("principalClass");
        String name = (String)options.get("unauthenticatedIdentity");
        if(name != null)
            try
            {
                unauthenticatedIdentity = createIdentity(name);
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
    }


в passwordStacking  получается null, из-за чего useFirstPass  = false, поэтому login и не проходит

пока что не понял что такое (String)options.get("password-stacking");

методы getIdentity(), getRoleSets()  не вызывает потому, что до них просто не доходит   

Вообщем надо смотреть дальше, вдруг что получится =)
PM MAIL   Вверх
mbasil
Дата 19.11.2008, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: 9
Всего: 13



Все же сидит в подсознании интуитивное предположение, что в результате этого:
Код

LoginContext lc = new LoginContext ("auth", 
      new CustomCallbackHandler("name", "password"));
lc.login();

сервер не получает "password-stacking". Проверьте базовой аутентификацией, это ведь делается легко.

В конце концов вы можете нахально сунуть useFirstPass = true; вне всяких if'ов и посмотреть, что получится.

Это сообщение отредактировал(а) mbasil - 19.11.2008, 14:59
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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