Учебники

JSP — Безопасность

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

Доступно несколько уровней аутентификации: от базовой аутентификации с использованием идентификаторов и паролей до сложной аутентификации с использованием сертификатов.

Ролевая аутентификация

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

Вы можете определить разные роли в файле tomcat-users.xml , который находится в домашнем каталоге Tomcat в файле conf. Пример этого файла показан ниже —

<?xml version = '1.0' encoding = 'utf-8'?>
<tomcat-users>
   <role rolename = "tomcat"/>
   <role rolename = "role1"/>
   <role rolename = "manager"/>
   <role rolename = "admin"/>
   <user username = "tomcat" password = "tomcat" roles = "tomcat"/>
   <user username = "role1" password = "tomcat" roles = "role1"/>
   <user username = "both" password = "tomcat" roles = "tomcat,role1"/>
   <user username = "admin" password = "secret" roles = "admin,manager"/>
</tomcat-users>

Этот файл определяет простое сопоставление между именем пользователя, паролем и ролью . Обратите внимание, что данный пользователь может иметь несколько ролей; например, username = «both» входит в роль «tomcat» и роль «role1».

После того как вы определили и определили разные роли, ограничения безопасности на основе ролей могут быть наложены на разные ресурсы веб-приложения с помощью элемента <security-constraint> в файле web.xml, доступном в каталоге WEB-INF.

Ниже приведен пример записи в файле web.xml.

<web-app>
   ...
   <security-constraint>
      <web-resource-collection>
         <web-resource-name>SecuredBookSite</web-resource-name>
         <url-pattern>/secured/*</url-pattern>
         <http-method>GET</http-method>
         <http-method>POST</http-method>
      </web-resource-collection>
      
      <auth-constraint>
         <description>
            Let only managers use this app
         </description>
         <role-name>manager</role-name>
      </auth-constraint>
   </security-constraint>
   
   <security-role>
      <role-name>manager</role-name>
   </security-role>
   
   <login-config>
      <auth-method>BASIC</auth-method>
   </login-config>
   ...
</web-app>

Вышеуказанные записи будут означать —

  • Любой HTTP-запрос GET или POST к URL-адресу, совпадающему с / secured / *, будет подвергнут ограничениям безопасности.

  • Человек с ролью менеджера получает доступ к защищенным ресурсам.

  • Элемент login-config используется для описания ОСНОВНОЙ формы аутентификации.

Любой HTTP-запрос GET или POST к URL-адресу, совпадающему с / secured / *, будет подвергнут ограничениям безопасности.

Человек с ролью менеджера получает доступ к защищенным ресурсам.

Элемент login-config используется для описания ОСНОВНОЙ формы аутентификации.

Если вы попытаетесь просмотреть любой URL, включая каталог / security , появится следующее диалоговое окно с запросом имени пользователя и пароля. Если вы предоставите пользователю «admin» и пароль «secrer» , то у вас будет доступ к URL-адресу, сопоставленному с / secured / *, поскольку мы определили пользователя admin с ролью администратора, которому разрешен доступ к этому ресурсу.

Аутентификация на основе форм

Когда вы используете метод аутентификации FORM, вы должны предоставить форму входа в систему, чтобы запросить у пользователя имя пользователя и пароль. Ниже приведен простой код login.jsp . Это помогает создать форму для той же цели —

<html>
   <body bgcolor = "#ffffff">
      
      <form method = "POST" action ="j_security_check">
         <table border = "0">
            <tr>
               <td>Login</td>
               <td><input type = "text" name="j_username"></td>
            </tr>
            <tr>
               <td>Password</td>
               <td><input type = "password" name="j_password"></td>
            </tr>
         </table>
         <input type = "submit" value = "Login!">
         
      </form>
      
   </body>
</html>

Здесь вы должны убедиться, что форма входа в систему должна содержать элементы формы с именами j_username и j_password . Действие в теге <form> должно быть j_security_check . POST должен использоваться как метод формы. В то же время вам придется изменить тег <login-config>, указав метод auth как FORM —

<web-app>
   ...
   <security-constraint>
      <web-resource-collection>
         <web-resource-name>SecuredBookSite</web-resource-name>
         <url-pattern>/secured/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
      </web-resource-collection>
      
      <auth-constraint>
         <description>Let only managers use this app</description>
         <role-name>manager</role-name>
      </auth-constraint>
   </security-constraint>
   
   <security-role>
      <role-name>manager</role-name>
   </security-role>
   
   <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>
   ...
</web-app>

Теперь, когда вы пытаетесь получить доступ к любому ресурсу с URL / secured / * , он отобразит приведенную выше форму с запросом идентификатора пользователя и пароля. Когда контейнер видит действие « j_security_check », он использует некоторый внутренний механизм для аутентификации вызывающей стороны.

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

В случае сбоя входа в систему сервер отправляет обратно страницу, определенную параметром form-error-page

Здесь j_security_check — это действие, которое приложения, использующие вход на основе формы, должны указывать для формы входа. В той же форме вы также должны иметь элемент управления вводом текста с именем j_username и элемент управления вводом пароля с именем j_password . Когда вы видите это, это означает, что информация, содержащаяся в форме, будет отправлена ​​на сервер, который проверит имя и пароль. Как это сделать, зависит от сервера.

Проверьте стандартные реализации областей, чтобы понять, как j_security_check работает для контейнера Tomcat.

Программная безопасность в сервлете / JSP

Объект HttpServletRequest предоставляет следующие методы, которые можно использовать для анализа информации о безопасности во время выполнения.

S.No. Метод и описание
1

Строка getAuthType ()

Метод getAuthType () возвращает объект String, который представляет имя схемы аутентификации, используемой для защиты сервлета.

2

логическое isUserInRole (роль java.lang.String)

Метод isUserInRole () возвращает логическое значение: true, если пользователь находится в данной роли, или false, если это не так.

3

Строка getProtocol ()

Метод getProtocol () возвращает объект String, представляющий протокол, который использовался для отправки запроса. Это значение можно проверить, чтобы определить, использовался ли безопасный протокол.

4

логическое isSecure ()

Метод isSecure () возвращает логическое значение, представляющее, был ли запрос сделан с использованием HTTPS. Значение true означает, что это так и соединение безопасно. Значение false означает, что запрос не был.

5

Принцип getUserPrinciple ()

Метод getUserPrinciple () возвращает объект java.security.Principle, который содержит имя текущего аутентифицированного пользователя.

Строка getAuthType ()

Метод getAuthType () возвращает объект String, который представляет имя схемы аутентификации, используемой для защиты сервлета.

логическое isUserInRole (роль java.lang.String)

Метод isUserInRole () возвращает логическое значение: true, если пользователь находится в данной роли, или false, если это не так.

Строка getProtocol ()

Метод getProtocol () возвращает объект String, представляющий протокол, который использовался для отправки запроса. Это значение можно проверить, чтобы определить, использовался ли безопасный протокол.

логическое isSecure ()

Метод isSecure () возвращает логическое значение, представляющее, был ли запрос сделан с использованием HTTPS. Значение true означает, что это так и соединение безопасно. Значение false означает, что запрос не был.

Принцип getUserPrinciple ()

Метод getUserPrinciple () возвращает объект java.security.Principle, который содержит имя текущего аутентифицированного пользователя.

Например, для Страницы JavaServer, которая ссылается на страницы для менеджеров, у вас может быть следующий код:

<% if (request.isUserInRole("manager")) { %>
   <a href = "managers/mgrreport.jsp">Manager Report</a>
   <a href = "managers/personnel.jsp">Personnel Records</a>
<% } %>

Проверяя роль пользователя в JSP или сервлете, вы можете настроить веб-страницу таким образом, чтобы показывать пользователю только те элементы, к которым он имеет доступ. Если вам нужно имя пользователя, которое было введено в форме аутентификации, вы можете вызвать метод getRemoteUser в объекте запроса.