Аутентификация пользователя с помощью j_security_check в Java EE 7

#servlets #tomcat7 #forms-authentication #java-ee-7 #j-security-check

#сервлеты #tomcat7 #формы-аутентификация #java-ee-7 #j-проверка безопасности

Вопрос:

В настоящее время я практикую Java EE 7. Я сталкиваюсь с проблемой при попытке аутентификации пользователя с помощью способа, предоставляемого контейнером, т. Е. j_security_check .

  • Сервер приложений: Apache Tomcat 7
  • Имя проекта / приложения: ServletDrill
  • Ресурс (сервлет) с аннотацией @WebServlet

Мой Web.xml :

     <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>ServletDrill</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>

  <security-constraint>
    <web-resource-collection>
      <web-resource-name>To_Auth</web-resource-name>      
      <url-pattern>/auth/*</url-pattern>
      <http-method>GET</http-method>
      <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
      <role-name>valid</role-name>
    </auth-constraint>
  </security-constraint>

  <login-config>
    <auth-method>FORM</auth-method>    
    <form-login-config>
      <form-login-page>/FormAuth.jsp</form-login-page>
      <form-error-page>/LogInErr.jsp</form-error-page>
    </form-login-config>
  </login-config>
</web-app>
  

Мой tomcat-users.xml :

 <tomcat-users>
<role rolename="valid"/> 
 <user username="username" password="pass" roles="valid"/>
</tomcat-users>
  

Мой <form> :

 <form action="/ServletDrill/j_security_check" accept-charset="UTF-8" method="post">
<fieldset id="postForm">
<legend>j_security_check method</legend>
<div class="partContainer">
<div class="left"><label for="user" >User Name: </label></div>
<div class="right"><input type="text" name="j_username" id="user" required="required" maxlength="20"></div>
</div>
<hr/>

<div class="partContainer">
<div class="left"><label for="pass" >Pass: </label></div>
<div class="right"><input type="password" name="j_password" id="pass" required="required" maxlength="20"></div>
</div>

<hr/>
<div class="partContainer">
<div class="left"><input type="submit" value="Log In"></div>
<div class="right"><input type="reset" value="Reset"></div>
</div>
</fieldset>
</form>
  

Мой защищенный ресурс (сервлет):

 @WebServlet("/auth/NeedsPriorAuth")
public final class NeedsPriorAuth extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {       
        response.getWriter().append("Welcome, " request.getRemoteUser() ". The user has been authenticated before hand").append("n Auth Type: " request.getAuthType());
    }
}
  

Когда я выполняю следующую ссылку,

  <a href="/ServletDrill/auth/NeedsPriorAuth">Access Protected Servlet</a>
  

пользователь перенаправляется для аутентификации на следующей странице,

 <form-login-page>/FormAuth.jsp</form-login-page> 
  

( <form> то, что я опубликовал выше).
Несмотря на передачу правильных учетных данных (размещенных выше по адресу tomcat-users.xml ), пользователь перенаправлен на следующую страницу с ошибкой (размещенную выше по адресу Web.xml ):

 <form-error-page>/LogInErr.jsp</form-error-page>
  

В чем причина, которая вызывает у меня такие неудобства? Я застрял на этой проблеме уже несколько дней.
А что <realm> , мне это нужно?

Есть идеи?

Ответ №1:

Ну вот, в конце концов, я решил проблему. Модификация, которую мне нужно было применить:

 <form action="j_security_check" accept-charset="UTF-8" method="post">
  

То есть действие не имеет префикса контекста приложения.
Другое дело, что в моем случае существует 2 экземпляра tomcat-users.xml файл:

  • В каталоге Apache Tomcat v7 (серверное приложение)
  • И тот, который доступен из Project Explorer in Eclipse , под именем Servers2

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