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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TOMCAT BASIC vs FORM authentication, Передача паролей при авторизации 
:(
    Опции темы
Atum
Дата 18.1.2013, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Добрый день! Вопрос такой 

Чем  FORM authentication  лучше BASIC authentication ?! 

Задался таким вопросом - ведь при BASIC authentication - пароль передается в заголовке и при этом хранится там постоянно .

а при FORM authentication - пароль и логин передаются в теле POST  запроса (в открытом виде ? так или нет).


вот мой пример ! По ходу написания примера буду задавать сопутствующие вопросы ! (выделю их жирным)

что делаю - есть проект WebApplication1 - созданный в netbeans (  добавлены несколько  jsp страниц , один сервлет и один фильтр)

Есть tomcat 7 

для BASIC authentication

Для примера у меняя будет :
пользователь user -  пароль  user1 -  role  user_role
пользователь root -  пароль  root1 -   role  root_role

Используется  собственное окно браузера :
 
1. Прописываем ему web.xml
Код

<security-constraint>
  <web-resource-collection>
   <web-resource-name>
    Protected Site
   </web-resource-name>
   <!--  будем защищать весь сайт-->
   <url-pattern> /*</url-pattern>
   <!--все методы из списка -->
   <http-method> DELETE </http-method>
   <http-method> GET </http-method>
   <http-method> POST </http-method>
   <http-method> PUT </http-method>
  </web-resource-collection>
  <auth-constraint>
   <!-- Роль у которой будет доступ  на примере двух ролей -->
       <role-name> user_role </role-name>
       <role-name> root_role </role-name>
  </auth-constraint>
 </security-constraint>
 
 <!-- BASIC authentication -->
 <login-config>
  <auth-method> BASIC </auth-method>
  <realm-name> Example Basic Authentication </realm-name>
 </login-config>

 <!-- Define security roles -->
 <security-role>
  <description> Test role </description>
  <role-name>  user_role </role-name>
 </security-role>

 <!-- Define security roles -->
 <security-role>
  <description> Root role </description>
  <role-name>  root_role</role-name>
 </security-role>

  <filter>
    <filter-name>NewFilter</filter-name>
    <filter-class>com.vingrad.NewFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>NewFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <servlet>
    <servlet-name>NewServlet</servlet-name>
    <servlet-class>com.vingrad.NewServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>NewServlet</servlet-name>
    <url-pattern>/NewServlet</url-pattern>
  </servlet-mapping>
  <session-config>
    <session-timeout>
      30
    </session-timeout>
  </session-config>
</web-app>




2. Tomcat - tomcat-users.xml
Код

<tomcat-users>
  <role rolename="root_role"/>
  <role rolename="user_role"/>
  <user username="root" password="root1" roles="root_role"/>
  <user username="user" password="user1" roles="user_role"/>
</tomcat-users>



3. server.xml 

Вопрос ! Нужно ли это прописывать в server.xml ? 

Код

<Engine>
...
<Realm className="org.apache.catalina.realm.MemoryRealm" />
...
</Engine>
 


Первая проблема - это - проблема как выйти и зайти под другим пользователем !
Ибо в таком режиме авторизации пароль постоянно ходит в заголовке !

Сначала сделал так : 

4. logout (logout.jsp)

Код

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%
session.invalidate();
  response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // HTTP 401
  response.setHeader("WWW-Authenticate", "Basic realm=\"xyzzy\"");
  response.sendRedirect("index.jsp");
%>
  -  это решение не дает нормально разлогиниться! 

Пришлось делать так ! 

Код

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%
    session.invalidate();
    response.sendError(401, "Logout successful.");
%>


 Минус в том что мы не попадаем на главную страну ! Как его обойти ? 


FORM authentication

для наглядности я взял и создал таблицу для хранения логина и пароля в mysql 

чтобы не создавать две таблицы   user  и role -  я поместил все данные в одну таблицу с полями id-  name - password - role


1. Меняем тип авторизации в web.xml : 
Код

<!-- FORM authentication -->
 <login-config>
  <auth-method>FORM</auth-method>
  <form-login-config>
    <form-login-page>/login.jsp</form-login-page>
    <form-error-page>/error.jsp</form-error-page>
  </form-login-config>
</login-config>


2. Удаляем все что вставили в tomcat-users.xml

3. Создаем login.jsp

Код

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Логин</title>
    </head>
    <body>
        <div id="center" class="login_img">
            <form action="j_security_check" method="POST">
                <table class="login_table">
                    <tr>
                        <td align="right"> Логин: </td>
                        <td align="right"> <input name="j_username"> </td>
                    </tr>  
                    <tr>
                        <td align="right"> Пароль: </td>
                        <td align="right"> <input type="password" name="j_password"> </td>
                    </tr>  
                    <tr>
                        <td align="right">  </td>
                        <td align="right"> <input type="submit" name="login" value="войти"> </td>
                    </tr>  
                </table>
            </form>
        </div>  
    </body>
</html> 



3. в context.xml  добавим коннект к базе и Realm

Код


<?xml version="1.0" encoding="UTF-8"?>
<Context antiJARLocking="true" path="/WebApplication1">
    <Resource 
      name="jdbc/mysql_srv"    
      auth="Container" 
      driverClassName="com.mysql.jdbc.Driver" 
      autoReconnect="true" 
      characterEncoding="UTF-8" 
      characterSetResults="UTF-8" 
      encoding="UTF-8" 
      maxActive="4" 
      maxIdle="2" 
      maxWait="5000" 
      password="************" 
      type="javax.sql.DataSource" 
      url="jdbc:mysql://127.0.0.1:3306/mysql_srv?characterEncoding=UTF-8" 
      useUnicode="true" 
      username="**********" 
      validationQuery="SELECT 1"/>   
    
     <Realm className="org.apache.catalina.realm.DataSourceRealm"
           userTable="LOGIN"
           userNameCol="NAME"
           userCredCol="PASSWORD"
           userRoleTable="LOGIN"
           roleNameCol="ROLE"
           localDataSource="true"
           dataSourceName="jdbc/mysql_srv"/>    
  
</Context>




тут важно  добавить Realm className="org.apache.catalina.realm.DataSourceRealm


Пароль и логин передаются в теле пост запроса . Хочется как то это изменить !?

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


Опытный
**


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

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



В чем вообще проблема? Небезопасен и тот и другой вариант.
По хорошему надо аутентифицировать через SSL.
PM MAIL   Вверх
Atum
Дата 23.1.2013, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mbasil @ 23.1.2013,  08:46)
В чем вообще проблема? Небезопасен и тот и другой вариант.
По хорошему надо аутентифицировать через SSL.

Еще есть дайджест аутентификация.

Да ssl -  это самое безопасное из всего перечисленного. 

Но иногда требуется и простая авторизация .

вопрос как сделать авторизацию через форму с шифрованием пароля ?
PM MAIL   Вверх
mbasil
Дата 23.1.2013, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Можно зашифровать функцией JavaScript.
Однако это будет открыто для самого пользователя.
На мой взгляд, если все данные шифровать не требуется используйте HTTP, и только запрос и возврат формы аутентификации через HTTPS 
PM MAIL   Вверх
mbasil
Дата 31.1.2013, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Кстати мое предыдущее сообщение грешит неполнотой.

Если мы основные страницы будем передавать через HTTP, то злонамерененный кадр может, перехватив HTTP запрос,  из куки или из переопределнного URL выковырять ID клиента и заслать свой запрос с этим же ID.

Я не знаю, храниться ли ID сам по себе или совместно с адресом из которого пришли полномочия?

Если аутентифицированный клиент распознается только по ID, то при использовании HTTP с возможностью перехвата ID проблема не снимается  и в этом случае надо использовать HTTPS на протяжении всего сеанса.

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

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

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


 




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


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

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