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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вызов защищенного бина из незащищенного сервлета 
:(
    Опции темы
viktor_sch
Дата 3.3.2009, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я имею защищенный стандартным ролевым механизмом бин. И имею сервлет, который должен вызывать метод этого бина. Сервлет не защищен. Я явно указываю логин и пароль, как это советуют люди в мэйлистах и форумах:

Код

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Hashtable environment = new Hashtable();
environment.put(InitialContext.SECURITY_PRINCIPAL, "login");
environment.put(InitialContext.SECURITY_CREDENTIALS, "password");
InitialContext ctx = new InitialContext(environment);
Object obj = ctx.lookup("java:comp/env/ejb/DynamicDocumentMapper");
DynamicDocumentMapperLocalHome home = (DynamicDocumentMapperLocalHome) PortableRemoteObject.narrow(obj, DynamicDocumentMapperLocalHome.class);
DynamicDocumentMapperLocal documentMapper = home.create();
documentMapper.configurateSessionFactory();
PrintWriter writer = response.getWriter();
writer.println("Session Factory configurating complete successfully!");
}


Почему то у меня это не работает. Может потому, что сам сервлет не защищен. возникает исключение

Код

; nested exception is: com.ibm.websphere.csi.CSIAccessException: SECJ0053E: Authorization failed for /UNAUTHENTICATED while invoking (Home)ejb/.../DynamicDocumentMapperLocalHome create:4 securityName: /UNAUTHENTICATED;accessID: UNAUTHENTICATED is not granted any of the required roles: Users


Когда я защищаю сам сервлет, все, естественно, работает нормально. Проблема в том, что я не могу использовать защиту сервлета, потому что он должен будет вызываться автоматически из отдельностоящего http-клиента, логин и пароль к которому будут передаваться в виде джава аргументов.
Буду рад любым предложениям насчет того, как программно указать в сервлете параметры аутентификации.
PM   Вверх
ecologist
Дата 4.3.2009, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Чисто теоретически - можно сделать закрытый сервлет, в котором вызывать бин. И сделать открытый, который может форвардиться на закрытый сервлет. И в открытом сделать какую-то проверку введенных данных.
PM MAIL   Вверх
mbasil
Дата 4.3.2009, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Полагаю, что вместо этого
Код

environment.put(InitialContext.SECURITY_PRINCIPAL, "login");
environment.put(InitialContext.SECURITY_CREDENTIALS, "password");

надо задействовать JAAS.
Если web контейнер воспринимает аутентификацию и авторизацию правильно,
то она передается и в EJB контейнер.

PM MAIL   Вверх
viktor_sch
Дата 5.3.2009, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(mbasil @ 4.3.2009,  11:56)
надо задействовать JAAS.
Если web контейнер воспринимает аутентификацию и авторизацию правильно,
то она передается и в EJB контейнер.

Не подскажете ли каким образом следует использовать  JAAS, пример кода или ссылку куда-нить. Буду очень признателен.
А насчет аутентификации в web-контейнере, все правильно, как и описано в сановском туториале про безопасность.
А есть ли возможность программно передать параметры аутентификации при вызове сервлета или jsp-странички логина?
При настройке безопасности для веб-контейнера в случае модели FORM, в web.xml указывается страничка логина и страничка с выводом сообщения об ошибке аутентификации. Вот код странички логина:

Код

<html>
<head>
<title>Login Page</title>
</head>
<body>
<font size='5' color='blue'>Please Login</font>
<hr>

<form action='j_security_check' method='post'>
<table>
    <tr>
        <td>Name:</td>
        <td><input type='text' name='j_username'></td>
    </tr>
    <tr>
        <td>Password:</td>
        <td><input type='password' name='j_password' size='8'></td>
    </tr>
</table>
<br>
<input type='submit' value='login'></form>
</body>
</html>


Есть ли какой-то способ программно указать значения параметров j_username и j_password? Непонятно ведь, куда следует отправлять пост-запрос от http-клиента с этими параметрами? Идея собственно и заключается в том, чтобы вызвать защищенный сервлет полностью автоматически.
PM   Вверх
mbasil
Дата 5.3.2009, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



К сожалению под рукой у меня сейчас нет материалов, но достаточно
подробное описание (в части безопасности и JAAS) видел в книге: 

Хорстманн,  Корнелл "Java 2. Библиотека профессионала. Том 2. Тонкости программирования"

а также пример использования в книге:
Перри Брюс У. "Java сервлеты и JSP: сборник рецептов."

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

И еще одно замечание. Вот текст получения полномочий из HTTP запроса 
Код

      String credentials = request.getHeader( "Authorization" );

        if ( credentials != null ) {

            // Retrieve the credentials from the header string
            credentials = credentials.substring( 6 );
             // Decode the username:password string
            BASE64Decoder decoder = new BASE64Decoder();
            byte[] data = decoder.decodeBuffer( credentials );
            String pair = new String( data );

            // Retrieve the username portion of the credentials
            int indx = pair.indexOf(':');
            String username = pair.substring( 0, indx );
            String password = pair.substring( indx+1 );
 }
  
То есть в вашем клиенте "не браузере" вы можете в заголовок HTTP запроса "Authorization" запихнуть (обратным образом) нужные полномочия программно.

Это сообщение отредактировал(а) mbasil - 5.3.2009, 14:29
PM MAIL   Вверх
mbasil
Дата 5.3.2009, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Кстати

1. Чтобы использовать недокументированный кодер BASE64 нужно сделать импорт

Код
import sun.misc.BASE64Encoder;


2. Первые символы в HTTP заголовке "Authorization" это просто слово, обозначающее тип
    аутентификации (например Basic) и после пробела закодированные в BASE64 имя и пароль,
    разделенные символом двоеточия. Таким образом ваш клиент сможет сгенерировать и
    передать имя и пароль. И конечно в случае автоматической засылки имени и пароля
    из клиента не браузера надо использовать аутентификацию не формой, а   Basic

3. Заставить клиента аутентифицироваться можно также программно, заслав ему
    (например в фильтре) только следующее:
Код

 response.setStatus( HttpServletResponse.SC_UNAUTHORIZED );
 response.setHeader("WWW-Authenticate", "Basic realm=dvdLogin"); 



Это сообщение отредактировал(а) mbasil - 5.3.2009, 16:57
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.0779 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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