Tomcat 6.0中的BASIC身份验证和SSL配置失败

时间:2013-02-24 17:17:44

标签: java xml ssl tomcat6 basic-authentication

应用程序是一个简单的JSP / Servlet应用程序。我想执行用户身份验证(使用BASIC身份验证),如果用户通过身份验证,那么我将使用SSL(即https)将它们重定向到主屏幕。 必须在单击按钮时执行BASIC身份验证。

为实现这一目标;最初我在我的web.xml中配置了BASIC身份验证,如下所示:

<security-role>
  <role-name>Admin</role-name>      
</security-role>
<security-role>
  <role-name>Guest</role-name>
</security-role>
<security-constraint>      
  <web-resource-collection>
      <web-resource-name>BasicDemo</web-resource-name>
      <url-pattern>/*</url-pattern>
      <http-method>POST</http-method>
  </web-resource-collection>
  <auth-constraint>
      <role-name>Admin</role-name>
  </auth-constraint>
</security-constraint>
<login-config>
  <auth-method>BASIC</auth-method>      
</login-config>

代码的用户BASIC Authentcation部分工作正常(弹出对话框出现询问用户名和密码,并且工作正常)

然后我按照以下步骤配置了SSL:

1)使用keytool生成密钥库

2)在server.xml中添加了以下条目:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
           maxThreads="150" scheme="https" secure="true"
           clientAuth="false" sslProtocol="TLS" 
       keystoreFile="${user.home}/.keystore"
       keystorePass="password" />

3)在

中的web.xml中添加了这个
<user-data-constraint>
      <transport-guarantee>CONFIDENTIAL</transport-guarantee>
  </user-data-constraint> 

在运行应用程序时,下面是我遇到的问题:

1)单击按钮(必须为其执行BASIC身份验证)时,未出现身份验证对话框(出现在BASIC身份验证中,要求输入用户名和密码)

2)我被重定向到https的链接(是的,https中出现了https),并且执行了servlet的doGet()方法,这是不正确的,因为提交按钮的形式是这样的,henc是doPost应该执行方法而不是doGet:

<form action="CentralController" method="post">

我身边的一个错误可能是使用POST而不是GET进行身份验证,但我觉得这应该可行,我可能会遗漏一些东西,因此它不起作用。请告诉我问题在哪里以及如何解决问题达到我的期望。

修改

web.xml

中的Servlet定义
 <servlet>
  <servlet-name>CentralController</servlet-name>
  <servlet-class>com.controller.CentralController</servlet-class>
  </servlet>
  <servlet-mapping>
  <servlet-name>CentralController</servlet-name>
  <url-pattern>/CentralController</url-pattern>
  </servlet-mapping>

这是表格:

<form action="CentralController" method="post">
    <input type="submit" value="Submit" name="submit">
</form>

2 个答案:

答案 0 :(得分:3)

在获取/转换后,如果我正确理解您的方案,您将遇到经典的HTTP重定向“问题”。

当使用非SSL请求访问SSL安全性约束时,服务器会向客户端发送HTTP 302响应(也称为重定向)到https URL。 在所有客户端HTTP堆栈上,此重定向的实现并不完全相同,但基本上大多数情况下,重定向是通过发出GET来处理的,无论原始HTTP动词是什么(POST或其他)。

你可以在维基百科及其链接上找到很多关于此的讨论 http://en.wikipedia.org/wiki/HTTP_302 另请参阅Response.Redirect with POST instead of Get?HTTP: POST request receives a 302, should the redirect-request be a GET?进行讨论。 或者通常在谷歌上,“HTTP 302 POST”。

可悲的结论是,当发送(在您的情况下为HTTP)HTTPS重定向时,您不能指望保留原始请求的POST性质,它将取决于浏览器,并且有许多浏览器可以无论重定向状态代码(302,307等)都会发出GET。

您可能仍希望尝试上面第一个链接中描述的解决方法。

答案 1 :(得分:2)

我发现有两个主要问题,
1)基本认证没有出现在点击
上 2)点击doGet而不是doPost

让我们一步一步创建这个应用程序.....
1)创建2个jsp和1个servlet。

index.jsp
<form action="RegisterServlet" method="post"> {
{1}} {
{1}}
RegisterServlet.java
<input type="submit" name="submit"> {
{1}} {
{1}} {
{1}}

2)申请基本认证
的web.xml
</form>
doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { {
{1}} {
{1}} {
{1}} {
{1}} {
{1}}
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/welcome.jsp"); {
{1}} {
{1}} {
{1}} {
{1}} {
{1}} {
{1}} {
{1}} {
{1}} {
{1}} {
{1}} <登记/> dispatcher.forward(request,response);


**我已经为RegisterServlet提供了基本身份验证。这将在index.jsp的表单提交上启用基本身份验证。同时添加}

tomcat-users.xml 中创建角色和用户
<security-constraint> {
{1}}



3)下面的web.xml代码 <web-resource-collection> {
{1}} {
{1}}
<web-resource-name>BasicAuth</web-resource-name> 如果打电话给http到https,它会调用GET,因为它被认为是一种不好的做法,所以要进行POST,要么在行动中你可以提供一个完整的路径(url)...... 。或从https资源访问https。