Аутентификация пользователя с использованием входа в систему servlet 3.0 в Jsf 2 не работает

#jsf #tomcat #servlets #login #jsf-2

#jsf #tomcat #сервлеты #аутентификация #jsf-2

Вопрос:

Попытка создать приложение со страницей входа и использовать метод входа в систему Servlet 3.0. Я определил область в tomcat и настроил web.xml соответственно. Но когда я пытаюсь получить доступ к любой странице, даже к странице входа, она не отображается, и я вижу теги JSF в коде. Я не знаю, не упустил ли я чего-то. Ниже приведены подробности о том, что я поместил в web.xml .

 <security-constraint>
<display-name>Restricted</display-name>
  <web-resource-collection>
    <web-resource-name>Restricted Area</web-resource-name>
    <url-pattern>/faces/*</url-pattern>
    <http-method>GET</http-method>
    <http-method>POST</http-method>
  </web-resource-collection>
  <auth-constraint>
<role-name>user</role-name>
  </auth-constraint>
 </security-constraint>
 <login-config>
   <auth-method>FORM</auth-method>
    <form-login-config>
        <form-login-page>/index.xhtml</form-login-page>
        <form-error-page>/index.xhtml</form-error-page>
    </form-login-config>
</login-config>
<security-role>
  <role-name>user</role-name>
</security-role>
  

Ниже приведена область, определенная в tomcat

 <Realm className="org.apache.catalina.realm.JDBCRealm" driverName="com.mysql.jdbc.Driver"
            connectionURL="jdbc:mysql://localhost:3306/db_name?user=useramp;amp;password=password"
            userTable="users" userNameCol="username" userCredCol="userpass"
            userRoleTable="user_roles" roleNameCol="rolename" digest="MD5"/>
  

Код для входа в систему

 public String login(){
    HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
    try {
        //Login via the Servlet Context
        request.login(username, password);
        return "success";
    } catch (ServletException e) {
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Invalid Login", null));
        e.printStackTrace();
    }
    return "failure";
}
  

Дайте мне знать, что я делаю что-то не так


Обновление Спасибо, ребята, это начало работать. Мне пришлось изменить некоторые сопоставления URL в web.xml и измените порядок папок для настройки безопасности. В настоящее время он работает, но теперь у него просто странная проблема. Я определил

 <form-login-config>
 <form-login-page>/index.xhtml</form-login-page>
 <form-error-page>/index.xhtml</form-error-page>
</form-login-config>
  

И теперь web.xml показать ошибку на

 <form-login-page>
  

и жалуется, что

Описание Ошибка типа местоположения пути к ресурсу: форма атрибута-ошибка -ссылки на страницы /index.jsp, которые не существуют в веб-контенте web.xml /XXXX/WebContent/WEB-INF

Я понятия не имею, откуда это взялось, поскольку я не использую ни один файл jsp. Какие-либо подсказки

Комментарии:

1. @BalusC Спасибо за редактирование, которое вы внесли в ответ, который вы также объединили, это действительно помогает, когда люди это делают.

Ответ №1:

Итак, FacesServlet вызов не был произведен. Это означает, что URL-адрес страницы входа в систему не соответствует шаблону URL FacesServlet -адреса, как вы определили в web.xml . В соответствии с шаблоном URL вашей ограниченной области , который был установлен /faces/* , я предполагаю, что это тот же шаблон URL, который вы определили для FacesServlet .

Итак, исправьте это соответствующим образом:

 <form-login-page>/faces/index.xhtml</form-login-page>
<form-error-page>/faces/index.xhtml</form-error-page>
  

Тем не менее, я бы предложил вместо этого использовать сопоставление FacesServlet on *.xhtml , чтобы вам никогда не нужно было беспокоиться о вводе /faces пути или о том, что конечный пользователь сможет видеть необработанный исходный код JSF всякий раз, когда конечный пользователь удаляет /faces URL из адресной строки браузера.


Обновление: это специфичная для IDE ошибка проверки. IDE, которую вы используете, притворяется умнее, чем она есть на самом деле. Если ваше веб-приложение работает и работает нормально, просто игнорируйте его. При необходимости вы можете отключить проверку XML IDE в ее настройках.

Ответ №2:

Установить

 <servlet>
    <servlet-name>Faces Servlet</servlet-name>
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>Faces Servlet</servlet-name>
    <url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
  

в web.xml и изменить (в <security-constraint> разделе)

 <url-pattern>/faces/*</url-pattern>
  

Для

 <url-pattern>/*</url-pattern>
  

Комментарии:

1. Согласно вашему редактированию, /* это довольно ограничительно. Вы были бы вынуждены встроить весь код CSS / JS в HTML вместо того, чтобы ссылаться на них как <link> , <script> , и т.д., Чтобы использовать их на своей странице входа. Вы также не сможете размещать изображения на странице входа, если вы не полагаетесь на браузеры, поддерживающие схему URI данных. Я думаю, что лучше использовать шаблон URL *.xhtml или (реальную!) Папку /app/* .

2. Я предпочитаю определять a security-constraint без auth-constraint тега для /img/* и /style/* т. Д., Чтобы они были доступны без входа в систему.