Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Примеры: защита веб-приложений

Для корректной работы любого примера требуется некоторая предварительная настройка.

Здесь рассматриваются следующие темы:

Обзор примеров защиты веб-приложений

В примерах используются аннотации, программная и/или декларативная безопасность для демонстрации добавления безопасности в существующие веб-приложения.

Вот некоторые другие места, где вы найдёте примеры защиты различных типов приложений:

Настройка системы для запуска примеров безопасности

Чтобы настроить систему для запуска примеров безопасности, необходимо настроить базу данных пользователей, которую приложение может использовать для аутентификации пользователей. Прежде чем продолжить, выполните следующие действия.

  1. Удостоверьтесь, чтобы GlassFish Server был запущен (см. Запуск и остановка сервера GlassFish).

  2. Добавьте авторизованного пользователя в GlassFish Server. Для примеров в этой главе и в главе 52 «Начало работы по защите EJB-приложений» добавьте пользователя в область file сервера GlassFish и в группу TutorialUser.

  3. В Консоли администрирования разверните узел Конфигурации, затем разверните узел серверной конфигурации.

  4. Разверните узел безопасности.

  5. Разверните узел Realms.

  6. Выберите узел File.

  7. На странице «Изменить область» нажмите «Управление пользователями».

  8. На странице «Пользователи File» нажмите «Создать».

  9. В поле Идентификатор пользователя введите идентификатор пользователя.

  10. В поле списка групп введите TutorialUser.

  11. В полях Новый пароль и Подтверждение нового пароля введите пароль.

  12. Нажмите ОК.

    Обязательно запишите имя пользователя и пароль для пользователя, которого вы создаёте, чтобы вы могли использовать его для тестирования примеров приложений. Аутентификация чувствительна к регистру имени пользователя и пароля, поэтому пишите имя пользователя и пароль тщательно. Эта тема обсуждается более подробно в Управление пользователями и группами на сервере GlassFish.

    Примечание:

    API безопасности Java EE требует, чтобы принципалам назначались одноимённые роли. Следовательно, параметр Назначение по умолчанию для ролей включён по умолчанию на странице безопасности консоли.

Пример hello2-basicauth: базовая аутентификация с сервлетом

В этом примере объясняется, как использовать базовую аутентификацию с сервлетом. При базовой аутентификации сервлета веб-браузер предоставляет стандартное диалоговое окно входа в систему, которое нельзя настроить. Когда пользователь отправляет своё имя и пароль, сервер определяет, являются ли указанные имя пользователя и пароль реквизитами авторизованного пользователя, и отправляет запрошенный веб-ресурс, если пользователь авторизован для его просмотра.

В общем, для добавления базовой аутентификации в незащищённый сервлет необходимы следующие шаги, такие как описанные в главе 6 «Начало работы с веб-приложениями». В примере приложения из этого учебника многие из этих шагов были выполнены и перечислены здесь просто для того, чтобы показать, что нужно сделать, если вы захотите создать подобное приложение. Это приложение можно найти в каталоге tut-install/examples/security/hello2-basicauth/.

  1. Следуйте инструкциям в Настройка системы для запуска примеров безопасности.

  2. Создайте веб-модуль для примера сервлета hello2, как описано в главе 6 «Начало работы с веб-приложениями».

  3. Добавьте соответствующие аннотации безопасности к сервлету. Аннотации безопасности описаны в Указание безопасности для базовой аутентификации с использованием аннотаций.

  4. Соберите, упакуйте и разверните веб-приложение, выполнив шаги из Сборка, упаковка и развёртывание примера hello2-basicauth с использованием IDE NetBeans или Сборка, упаковка и развёртывание примера hello2-basicauth с использованием Maven.

  5. Запустите веб-приложение, выполнив шаги, описанные в Запуск hello2-basicauth.

Указание безопасности для базовой аутентификации с использованием аннотаций

Механизм аутентификации по умолчанию, используемый GlassFish Server, — это базовая аутентификация. При базовой аутентификации сервер GlassFish создаёт стандартное диалоговое окно входа в систему для получения данных об имени пользователя и пароле для доступа к защищённому ресурсу. После аутентификации пользователя доступ к защищённому ресурсу разрешается.

Чтобы указать безопасность для сервлета, используйте аннотацию @ServletSecurity. Эта аннотация позволяет указывать как конкретные ограничения для методов HTTP, так и более общие ограничения, которые применяются ко всем методам HTTP, для которых не указано никаких конкретных ограничений. В аннотации @ServletSecurity можно указать следующие аннотации:

  • @HttpMethodConstraint, которая применяется к определённому методу HTTP

  • Более общая @HttpConstraint, которая применяется ко всем методам HTTP, для которых нет соответствующей аннотации @HttpMethodConstraint

Обе аннотации @HttpMethodConstraint и @HttpConstraint в аннотации @ServletSecurity могут указывать следующее:

  • Элемент transportGuarantee определяет требования к защите данных (то есть, требуется ли SSL/TLS), которые должны выполняться соединениями, по которым поступают запросы. Допустимые значения для этого элемента: NONE и CONFIDENTIAL.

  • Элемент roleAllowed, который определяет имена авторизованных ролей.

Для приложения hello2-basicauth, GreetingServlet имеет следующие аннотации:

@WebServlet(name = "GreetingServlet", urlPatterns = {"/greeting"})
@ServletSecurity(
@HttpConstraint(transportGuarantee = TransportGuarantee.CONFIDENTIAL,
    rolesAllowed = {"TutorialUser"}))

Эти аннотации указывают, что URI запроса /greeting могжет быть доступен только пользователям, которым был разрешён доступ к этому URL, поскольку было подтверждено, что они имеют роль TutorialUser. Данные будут отправлены через защищённый транспорт, чтобы данные пользователя и пароль не могли быть прочитаны при передаче.

Если используется аннотация @ServletSecurity, указывать параметры безопасности в дескрипторе развёртывания не обязательно. Используйте дескриптор развёртывания, чтобы указать параметры для механизмов проверки подлинности по умолчанию, для которых нельзя использовать аннотацию @ServletSecurity.

Сборка, упаковка и развёртывание примера hello2-basicauth с использованием IDE NetBeans

  1. Следуйте инструкциям в Настройка системы для запуска примеров безопасности.

  2. В меню «Файл» выберите «Открыть проект».

  3. В диалоговом окне «Открыть проект» перейдите к:

    tut-install/examples/security
  4. Выберите каталог hello2-basicauth.

  5. Нажмите Открыть проект.

  6. На вкладке «Проекты» кликните правой кнопкой мыши проект hello2-basicauth и выберите «Сборка».

    Эта команда собирает и развёртывает пример приложения в GlassFish Server.

Сборка, упаковка и развёртывание примера hello2-basicauth с использованием Maven

  1. Следуйте инструкциям в Настройка системы для запуска примеров безопасности.

  2. В окне терминала перейдите в:

    tut-install/examples/security/hello2-basicauth/
  3. Введите следующую команду:

    mvn install

    Эта команда собирает и упаковывает приложение в WAR-файл hello2-basicauth.war, расположенный в каталоге target, а затем развёртывает WAR-файл.

Запуск hello2-basicauth

  1. В веб-браузере введите следующий URL:

    https://localhost:8181/hello2-basicauth/greeting

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

    Откроется диалоговое окно «Требуется аутентификация». Его внешний вид зависит от браузера, который вы используете.

  2. Введите комбинацию имени пользователя и пароля, соответствующие пользователю, который уже был создан в области безопасности file GlassFish Server и был добавлен в группу TutorialUser, и нажмите ОК.

    Базовая аутентификация чувствительна к регистру как для имени пользователя, так и для пароля, поэтому введите имя пользователя и пароль в точности так, как это определено для сервера GlassFish.

    Сервер возвращает запрошенный ресурс, если выполнены все следующие условия:

    • Пользователь с указанным именем определён для сервера GlassFish.

    • Пользователь с указанным именем пользователя имеет введённый вами пароль.

    • Введённая комбинация имени пользователя и пароля связана с группой TutorialUser в GlassFish Server.

    • Роль TutorialUser, определённая в приложении, соответствует группе TutorialUser, определённой в GlassFish Server.

  3. Введите имя в поле и нажмите «Отправить».

    Поскольку вы уже авторизованы, имя, которое вы вводите на этом шаге, не имеет никаких ограничений. Сейчас у вас есть неограниченный доступ к приложению.

    Приложение отвечает «Hello» на имя, которое вы ввели.

Пример hello1-formauth: аутентификация на основе форм в приложении JavaServer Faces

В этом примере объясняется, как использовать аутентификацию на основе форм в приложении JavaServer Faces. С помощью аутентификации на основе форм вы можете настроить экран входа в систему и страницы ошибок, которые отображаются веб-клиентом для аутентификации имени пользователя и пароля. Когда пользователь отправляет своё имя и пароль, сервер определяет, принадлежат ли введёные реквизиты авторизованному пользователю, и, если да, отправляет запрошенный веб-ресурс.

В этом примере hello1-formauth добавлена ​​защита для приложения JavaServer Faces, показанного в веб-модуле с использованием JavaServer Faces: пример hello1.

В общем, шаги, необходимые для добавления аутентификации на основе форм в незащищённое приложение JavaServer Faces, аналогичны тем, которые описаны в Пример hello2-basicauth: базовая аутентификация с сервлетом. Основное отличие состоит в том, что вы должны использовать дескриптор развёртывания, чтобы указать использование аутентификации на основе форм, как описано в Указание безопасности для примера аутентификации на основе форм. Кроме того, вы должны создать страницу формы входа и страницы ошибок, как описано в Создание формы входа и страницы ошибок.

Это приложение можно найти в каталоге tut-install/examples/security/hello1-formauth/.

Создание формы входа и страницы ошибок

При использовании механизмов входа на основе форм необходимо указать страницу, содержащую форму, которую вы хотите использовать для получения имени пользователя и пароля, а также страницу, отображаемую в случае сбоя аутентификации при входе. В этом разделе обсуждаются форма входа и страница ошибки, использованная в этом примере. Указание безопасности для примера проверки подлинности на основе форм показывает, как эти страницы указываются в дескрипторе развертывания.

Страница входа может быть страницей HTML или сервлетом, и она должна возвращать страницу HTML, содержащую форму, которая соответствует определённым соглашениям об именах (см. Спецификацию Java Servlet 4.0 для получения дополнительной информации об этих требованиях). Для этого включите элементы, которые принимают имя пользователя и пароль, между тегами <form></form> на странице входа. Содержимое HTML-страницы или сервлета для страницы входа в систему должно быть закодировано следующим образом:

<form method="post" action="j_security_check">
    <input type="text" name="j_username">
    <input type="password" name= "j_password">
</form>

Полный код страницы login.html входа в систему, используемый в этом примере, можно найти в каталоге tut-install/examples/security/hello1-formauth/src/main/webapp/. Вот код для этой страницы:

<html lang="en">
    <head>
        <title>Login Form</title>
    </head>
    <body>
        <h2>Hello, please log in:</h2>
        <form method="post" action="j_security_check">
            <table role="presentation">
                <tr>
                    <td>Please type your user name: </td>
                    <td><input type="text" name="j_username"
                               size="20"/></td>
                </tr>
                <tr>
                    <td>Please type your password: </td>
                    <td><input type="password" name="j_password"
                               size="20"/></td>
                </tr>
            </table>
            <p></p>
            <input type="submit" value="Submit"/>
            &nbsp;
            <input type="reset" value="Reset"/>
        </form>
    </body>
</html>

Страница ошибки входа отображается, если пользователь вводит комбинацию имени пользователя и пароля, которая не авторизована для доступа к защищённому URI. В этом примере страницу error.html ошибки входа можно найти в каталоге tut-install/examples/security/hello1-formauth/src/main/webapp/. В этом примере страница ошибки входа в систему объясняет причину получения страницы ошибки и предоставляет ссылку, которая позволит пользователю повторить попытку. Вот код для этой страницы:

<html lang="en">
    <head>
        <title>Login Error</title>
    </head>
    <body>
        <h2>Invalid user name or password.</h2>

        <p>Please enter a user name or password that is authorized to access
           this application. For this application, this means a user that
           has been created in the <code>file</code> realm and has been
           assigned to the <em>group</em> of <code>TutorialUser</code>.</p>
        <p><a href="login.html">Return to login page</a></p>
    </body>
</html>

Указание безопасности для примера проверки подлинности на основе форм

В этом примере показано очень простое веб-приложение на основе сервлетов и добавлена ​​аутентификация на основе форм. Чтобы использовать аутентификацию на основе формы вместо базовой аутентификации для примера JavaServer Faces, необходимо использовать дескриптор развёртывания.

В следующем примере кода показаны элементы безопасности, добавленные в дескриптор развёртывания для этого примера, который можно найти в tut-install/examples/security/hello1-formauth/src/main/webapp/WEB-INF/web.xml:

    <security-constraint>
        <display-name>Constraint1</display-name>
        <web-resource-collection>
            <web-resource-name>wrcoll</web-resource-name>
            <description/>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <description/>
            <role-name>TutorialUser</role-name>
        </auth-constraint>
    </security-constraint>

    <login-config>
        <auth-method>FORM</auth-method>
        <realm-name>file</realm-name>
        <form-login-config>
            <form-login-page>/login.xhtml</form-login-page>
            <form-error-page>/error.xhtml</form-error-page>
        </form-login-config>
    </login-config>

    <security-role>
        <description/>
        <role-name>TutorialUser</role-name>
    </security-role>

Сборка, упаковка и развёртывание примера hello1-formauth с использованием IDE NetBeans

  1. Следуйте инструкциям в Настройка системы для запуска примеров безопасности.

  2. В меню «Файл» выберите «Открыть проект».

  3. В диалоговом окне «Открыть проект» перейдите к:

    tut-install/examples/security
  4. Выберите каталог hello1-formauth.

  5. Нажмите Открыть проект.

  6. На вкладке «Проекты» кликните правой кнопкой мыши проект hello1-formauth и выберите «Выполнить».

    Эта команда собирает и развёртывает пример приложения в GlassFish Server, а затем открывает его в браузере.

Сборка, упаковка и развёртывание примера hello1-formauth с помощью Maven и команды asadmin

  1. Следуйте инструкциям в Настройка системы для запуска примеров безопасности.

  2. В окне терминала перейдите в:

    tut-install/examples/security/hello1-formauth/
  3. Введите следующую команду в окне терминала или командной строке:

    mvn install

    Эта команда собирает и упаковывает приложение в WAR-файл hello1-formauth.war, расположенный в каталоге target, а затем развёртывает WAR-файл на сервере GlassFish.

Запуск примера hello1-formauth

Чтобы запустить веб-клиент для hello1-formauth, выполните следующие действия.

  1. Откройте веб-браузер по следующему URL:

    http://localhost:8080/hello1-formauth/
  2. В форме входа введите комбинацию имени пользователя и пароля, соответствующие пользователю, который уже был создан в области безопасности file сервера GlassFish и был включён в группу TutorialUser.

    Аутентификация на основе форм чувствительна к регистру как имени пользователя, так и пароля, поэтому введите имя пользователя и пароль в точности так, как это определено для сервера GlassFish.

  3. Нажмите Отправить.

    Если вы ввели My_Name в качестве имени и My_Pwd в качестве пароля, сервер вернёт запрошенный ресурс, если выполнены все следующие условия.

    • В GlassFish Server определён пользователь с именем My_Name.

    • Пользователь с именем My_Name имеет пароль My_Pwd, определённый в GlassFish Server.

    • Пользователь My_Name с паролем My_Pwd является членом группы TutorialUser в GlassFish Server.

    • Роль TutorialUser, определённая в приложении, назначена группе TutorialUser, определённой в GlassFish Server.

    Когда эти условия выполнены и сервер аутентифицировал пользователя, приложение становится доступным.

  4. Введите своё имя и нажмите «Отправить».

    Поскольку вы уже авторизованы, имя, которое вы вводите на этом шаге, не имеет никаких ограничений. Сейчас у вас есть неограниченный доступ к приложению.

    Приложение отвечает вам «Hello».

Дальнейшие шаги

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


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)