3

Обновление: код работает правильно, когда элемент <auth-constraint> удален полностью. Может ли кто-нибудь объяснить, почему он не работает, когда он присутствует?Как исправить доступ Tomcat к запрошенному resouce, который был отклонен?

Я пишу код для практики обеспечения сервлет в дескрипторе развертывания, и я получаю следующее в браузере:

HTTP Status 403 - Access to the requested resource has been denied 
type Status report 
message Access to the requested resource has been denied 
description Access to the specified resource has been forbidden. 
Apache Tomcat/7.0.42 

Любые мысли относительно того, что я делаю неправильно? Я проделал поиск по предыдущим сообщениям, и кажется, что, возможно, были обновления имен ролей в Tomcat 7 - я играл с этим, но пока не добился успеха. (Код ниже).

web.xml

<?xml version="1.0" ?> 
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee  
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 

<servlet> 
    <servlet-name>CheckedServlet</servlet-name> 
    <servlet-class>webcert.ch05.ex0502J.CheckedServlet</servlet-class> 
    <security-role-ref> 
     <role-name>MGR</role-name> 
     <role-link>manager</role-link> 
    </security-role-ref> 
</servlet> 
<servlet-mapping> 
    <servlet-name>CheckedServlet</servlet-name> 
    <url-pattern>/CheckedServlet</url-pattern> 
</servlet-mapping> 
<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>CheckedServletConstraint</web-resource-name> 
     <url-pattern>/CheckedServlet</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>*</role-name> 
    </auth-constraint> 
</security-constraint> 
<security-role> 
    <role-name>manager</role-name> 
</security-role> 

CheckedServlet.java

package webcert.ch05.ex0502J; 
import java.io.*; 
import javax.servlet.*; 
import javax.servlet.http.*; 
import java.security.*; 

public class CheckedServlet extends HttpServlet{ 

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    doGet(request, response); 
} 
protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException{ 

    response.setContentType("text/html"); 
    PrintWriter out = response.getWriter(); 
    out.write("<html><head><title>CheckedServlet</title></head><body>"); 

    String userMessage; 
    Principal user = request.getUserPrincipal(); 
    if(user == null) 
     userMessage = "Access denied."; 
    else 
     userMessage = "Access granted."; 

    out.write("<br>" + userMessage + " Principal name is " + user + 
       "<br>If authorized, you should see some more text below:"); 

    if(request.isUserInRole("manager")) 
     out.write("<br>Here's some super secret extra text since your " + 
       "role is manager."); 

    out.write("</body></html>"); 
    out.flush(); 
    out.close(); 
} 
} 
+0

Здравствуй Джефф, вы смогли найти причину? Я также заметил ту же проблему на моем ящике. Я был бы очень признателен, если бы вы могли поделиться им здесь. Спасибо. – Tariq

+0

Привет, Тарик - пока нет удачи. Я задал этот вопрос в контексте изучения экзамена OCWCD, поэтому с тех пор я перешел к другим темам. Я планирую пересмотреть свой следующий проход через текст, и я обязательно отправлю сообщение, если найду ответ. –

+0

Спасибо, Джефф. Я ценю, что :) – Tariq

ответ

4

Если включить безопасность для вас веб-приложения (как вы сделали, добавив пункт <security-constraint> на web.xml), вам также необходимо определить соответствующие пользователи/роли/пароли в t omcat-user.xml. Обычно этот файл находится в папке conf для установки tomcat. Вот образцы строк, которые можно добавить в файл-user.xml кота при инсталляции в:

<role rolename="MGR"/> 
<user password="mypassword" roles="MGR" username="user1"/> 
<user password="mypassword2" roles="MGR" username="user2"/> 

Теперь, когда вы получаете доступ к применению, вместо того, чтобы получать сообщение об ошибке состояния 403, приложение будет вместо предложит вам введите идентификатор пользователя/пароль, используя HTTP Basic Auth. Затем вы сможете успешно войти в систему, если используете один из указанных выше идентификаторов пользователей.

2

Вам нужно добавить следующее в вашем web.xml:

<login-config> 
    <auth-method>BASIC</auth-method> 
</login-config> 

, а затем вы можете также изменить ваш tomcat-user.xml, чтобы добавить роль и имя пользователя. После этого повторно разверните приложение, и эта проблема должна исчезнуть.