tomcat 7基于表单的身份验证

时间:2012-07-08 09:42:44

标签: security authentication tomcat servlets form-authentication

给出一个Servlet HelloServlet:

@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * Default constructor.
     */
    public HelloServlet() {
    // TODO Auto-generated constructor stub
    }


   @Override
    protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    System.out.print("hello my Friend: " + request.getRemoteUser());
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println("This is the Test Servlet");

    Enumeration headerNames = request.getHeaderNames();
    while (headerNames.hasMoreElements()) {
        String headerName = (String) headerNames.nextElement();
        out.print("<br/>Header Name: <em>" + headerName);
        String headerValue = request.getHeader(headerName);
        out.print("</em>, Header Value: <em>" + headerValue);
        out.println("</em>");
    }
    }
....
}

在web.xml中声明了tomcat安全策略:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>my application</web-resource-name>
        <url-pattern>/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>

    <auth-constraint>
        <role-name>tomcat</role-name>
    </auth-constraint>
</security-constraint>
<login-config>
    <auth-method>FORM</auth-method>
    <form-login-config>
        <form-login-page>/login.jsp</form-login-page>
        <form-error-page>/login-failed.jsp</form-error-page>
    </form-login-config>
</login-config>

和conf / tomcat-users.xml中的tomcat-roles定义

  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
  <user username="role1" password="tomcat" roles="role1"/>

“server.xml”中的领域是:

  <Realm className="org.apache.catalina.realm.LockOutRealm">
    <!-- This Realm uses the UserDatabase configured in the global JNDI
         resources under the key "UserDatabase".  Any edits
         that are performed against this UserDatabase are immediately
         available for use by the Realm.  -->
    <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
           resourceName="UserDatabase"/>
  </Realm>

,我尝试使用url localhost / jsfWorkgroup / HelloServlet访问Servlet“HelloServlet”。

像预期的那样,我被(重新)定向到登录页面:

<form method="POST" action="j_security_check">
<table>
  <tr>
    <td colspan="2">Login to the Tomcat-Demo application:</td>
  </tr>
  <tr>
    <td>Name:</td>
    <td><input type="text" name="j_username" /></td>
  </tr>
  <tr>
    <td>Password:</td>
    <td><input type="password" name="j_password"/ ></td>
  </tr>
  <tr>
    <td colspan="2"><input type="submit" value="Go" /></td>
  </tr>
</table>
</form>

无论我使用哪个id-Token:

  1. 用户名:tomcat passwort:tomcat
  2. username:both passwort:tomcat
  3. 我仍然遇到故障/login-failed.jsp。

    这是我对此的看法:tomcat将我重定向到登录页面,但是没有读取conf / tomcat-users.xml来有效登录(即使在几次重启后)。

    你怎么看待它?

    配置:Tomcat 7.0.23,Eclipse-Indigo

5 个答案:

答案 0 :(得分:2)

在@ pd40命题之后,我尝试了示例/ jsp / security / protected / examples,但没有在Eclipse IDE中,其中Tomcat通常与其他服务器(Glassfish,JBoss等)一起嵌入,而不是我开始将tomcat服务器作为独立服务器(在其/ bin目录中)..并且它可以工作。

但是当它试图在Eclipse中的Tomcat中运行基于安全性的Web应用程序时,它再次失败,即使使用上述配置也是如此。

我不知道我是否正确,但只有当tomcat在eclipse之外运行时才支持Web应用程序安全性。

答案 1 :(得分:1)

tomcat示例web.xml包含以下<login-config>

部分
<!-- Security roles referenced by this web application -->
<security-role>
  <role-name>role1</role-name>
</security-role>
<security-role>
  <role-name>tomcat</role-name>
</security-role>

您可能需要。


Tomcat包含一个示例war,其中包含使用 tomcat-users.xml 的auth,类似于您正在尝试的内容。如果部署 tomcat home / webapps / examples ,请尝试访问 http:// localhost / examples / jsp / security / protected / 。确保已删除 tomcat-users.xml 的角色/用户部分的XML注释。它们默认被注释掉。

<!-- Un comment me 
<role rolename="tomcat"/>
<role rolename="role1"/>
<user username="tomcat" password="tomcat" roles="tomcat"/>
<user username="both" password="tomcat" roles="tomcat,role1"/>
<user username="role1" password="tomcat" roles="role1"/>
-->

您可以考虑提升logging以帮助诊断身份验证问题。

答案 2 :(得分:1)

这对我来说太迟了,但也许有人来这里可能会觉得这很有用。

实际上,如果您遇到的问题是没有让tomcat配置通过eclipse运行并在其外部运行,那么只需从eclipse服务器选项卡中删除服务器并再次添加。这应该可以解决问题。

答案 3 :(得分:1)

您通过以下方式限制了对内容的访问 在web.xml中定义安全页面:

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

通配符引用内容路径中的所有页面。 因此,您获得了重定向到登录页面的无限循环。

答案 4 :(得分:0)

我发现如果更改嵌入在eclipse中的tomcat-users.xml中的用户配置,则必须重新启动eclipse,而不仅仅是服务器,以便识别新用户。我猜eclipse会缓存tomact-user.xml文件。