В нашей предыдущей статье мы объяснили, как защитить данные во время их передачи через безопасность транспортного уровня (TLS) / Secure Socket Layer (SSL) . Теперь давайте попытаемся понять, как применить механизм безопасности для веб-приложения на основе JEE 6, использующего сервер LDAP для аутентификации.
Задача:
• Настроить область LDAP на сервере приложений JEE.
• Примените безопасность JEE к образцу веб-приложения.
Используемые продукты:
- IDE: Netbeans 7.2
- Java Development Kit (JDK): версия 6
- Сервер Glassfish: 3.1
- Механизм аутентификации: аутентификация на основе форм
- Сервер аутентификации: LDAP OpenDS v2.2
Примените безопасность JEE к образцу веб-приложения:
Веб-приложения JEE могут быть защищены с помощью декларативной безопасности или программной безопасности.
Декларативная безопасность может быть реализована в приложениях JEE с помощью аннотаций или дескриптора развертывания. Этот тип механизма безопасности используется, когда роли и процесс аутентификации просты, когда он может использовать существующих поставщиков безопасности (даже внешних, таких как LDAP, Kerberos).
Программная безопасность обеспечивает дополнительный механизм безопасности, когда декларативной безопасности недостаточно для приложения в контексте. Он используется, когда нам требуется индивидуальная защита и когда богатый набор ролей, требуется аутентификация.
Настройка области на сервере приложений Glassfish
Перед настройкой области на сервере приложений Glassfish вам необходимо установить и настроить сервер LDAP, который мы будем использовать для нашего проекта. Вы можете получить полные инструкции в следующей статье: « Как установить и настроить сервер LDAP ».
После успешной установки запустите сервер Glassfish и перейдите в консоль администратора. Создайте новую Область LDAP.
Добавьте параметры конфигурации в соответствии с настройками, заданными для сервера LDAP.
Контекст JAAS — идентификатор, который будет использоваться в модуле приложения для соединения с сервером LDAP. (например, ldapRealm)
Directory — путь к URL-адресу сервера LDAP (например, ldap: // localhost: 389)
Базовое DN: Отличительное имя в каталоге LDAP, определяющее местоположение пользовательских данных.
Применение безопасности JEE к веб-приложению
Создайте образец веб-приложения в соответствии со следующей структурой:
Механизм аутентификации на основе форм будет использоваться для аутентификации пользователей.
Давайте объясним весь процесс с помощью приведенной выше диаграммы и кода.
Настройте пример веб-приложения в среде IDE Netbeans.
Шаг 1:
Как показано на приведенной выше схеме, браузер клиента пытается запросить защищенный ресурс с веб-сайта http: // {samplewebsite.com} / {contextroot} /index.jsp . Веб-сервер входит в файл веб-конфигурации и выясняет, что запрошенный ресурс защищен.
web.xml
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
< security-constraint > < display-name >SecurityConstraint</ display-name > < web-resource-collection > < web-resource-name >Secured resources</ web-resource-name > < url-pattern >/*</ url-pattern > </ web-resource-collection > < auth-constraint > < role-name >GeneralUser</ role-name > < role-name >Administrator</ role-name > </ auth-constraint > < user-data-constraint > < transport-guarantee >NONE</ transport-guarantee > </ user-data-constraint > </ security-constraint > |
Шаг 2:
Веб-сервер представляет клиенту Login.jsp как часть механизма аутентификации на основе форм. Эти конфигурации проверяются из файла веб-конфигурации.
web.xml
1
2
3
4
5
6
7
8
|
< login-config > < auth-method >FORM</ auth-method > < realm-name >ldapRealm</ realm-name > < form-login-config > < form-login-page >/Login.jsp</ form-login-page > < form-error-page >/LoginError.jsp</ form-error-page > </ form-login-config > </ login-config > |
Шаг 3:
Клиент отправляет форму входа на веб-сервер. Когда сервер обнаруживает, что действие формы имеет значение «j_security_check», он обрабатывает запрос на проверку подлинности учетных данных клиента. Форма jsp должна содержать элементы входа в систему j_username и j_password, которые позволят веб-серверу вызывать механизм аутентификации входа в систему.
Login.jsp
1
2
3
4
5
6
|
<form action= "j_security_check" method=post> <p>username: <input type= "text" name= "j_username" ></p> <p>password: <input type= "password" name= "j_password" ></p> <input type= "submit" value= "submit" > <input type= "reset" value= "Reset" > </form> |
При обработке запроса веб-сервер отправит запрос аутентификации на сервер LDAP, поскольку в логине конфигурации используется область LDAP. Сервер LDAP аутентифицирует пользователя на основе имени пользователя и пароля, хранящихся в хранилище LDAP.
Шаг 4:
Если аутентификация прошла успешно, защищенный ресурс (в данном случае index.jsp) возвращается клиенту, и контейнер использует идентификатор сеанса для идентификации сеанса входа для клиента. Контейнер поддерживает сеанс входа в систему с помощью файла cookie, содержащего идентификатор сеанса. Сервер отправляет этот файл cookie обратно клиенту, и, пока клиент может показать этот файл cookie для последующих запросов, контейнер легко распознает клиента и, следовательно, поддерживает сеанс для этого клиента.
Шаг 5:
Только если аутентификация не удалась, пользователь будет перенаправлен на LoginError.jsp согласно конфигурации в web.xml.
1
|
< form-error-page >/LoginError.jsp</ form-error-page > |
Здесь показано, как применить проверку подлинности на основе форм для примера веб-приложения. Теперь давайте кратко рассмотрим защищенный ресурс, который используется для этого проекта. В этом проекте защищенным ресурсом является index.jsp, который принимает имя пользователя и перенаправляет запрос в LoginServlet. Сервлет входа отправляет запрос в Success.jsp, который затем печатает имя пользователя на клиенте.
index.jsp
1
2
3
4
5
6
7
8
9
|
< body > < h2 >Please type your name</ h2 > < form method = "POST" action = "LoginServlet" > < input type = "text" name = "username" size = "25" > < p ></ p > < input type = "submit" value = "Submit" > < input type = "reset" value = "Reset" > </ form > </ body > |
LoginServlet.java
01
02
03
04
05
06
07
08
09
10
11
12
|
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType( "text/html;charset=UTF-8" ); PrintWriter out = response.getWriter(); try { RequestDispatcher requestDispatcher = getServletConfig().getServletContext(). getRequestDispatcher( "/Success.jsp" ); requestDispatcher.forward(request, response); } finally { out.close(); } } |
success.jsp
1
2
3
|
< body > < h1 >You have been successfully logged in as ${param.username}</ h1 > </ body > |
web.xml
1
2
3
4
5
6
7
8
|
< servlet > < servlet-name >LoginServlet</ servlet-name > < servlet-class >com.login.LoginServlet</ servlet-class > </ servlet > < servlet-mapping > < servlet-name >LoginServlet</ servlet-name > < url-pattern >/LoginServlet</ url-pattern > </ servlet-mapping > |
Вы можете скачать полный рабочий код по ссылке ниже: