servlet容器如何识别来自经过身份验证的用户的请求?

时间:2017-07-14 12:00:25

标签: tomcat authentication web.xml

如果我为我的Web应用程序的文件web.xml中的某些URL添加元素<security-constraint>,我的servlet容器(比如Tomcat)将保护这些URL并将未经身份验证的用户重定向到登录页面。

但是,servlet容器如何识别来自经过身份验证的用户的请求?

他们期望:

  • HTTP请求中的cookie? 哪一个?
  • HTTP标头?
  • 会话中的身份验证(会话ID?)

特别是,Tomcat在经过身份验证的用户的请求中寻找什么?

这是web.xml文件的一部分,根据常见教程中的示例。 servlet容器(特别是Tomcat)在请求中查找什么以将其标识为来自经过身份验证的用户?

<security-constraint>
  <display-name>Restricted GET To Employees</display-name>
  <web-resource-collection>
    <web-resource-name>Restricted Access - Get Only</web-resource-name>
    <url-pattern>/restricted/employee/*</url-pattern>
    <http-method>GET</http-method>
  </web-resource-collection>
  <auth-constraint>
    <role-name>Employee</role-name>
  </auth-constraint>
</security-constraint>

<login-config>
  <auth-method>FORM</auth-method>
  <realm-name>MyRealm</realm-name>
  <form-login-config>
    <form-login-page>/login/loginForm.jsp</form-login-page>
    <form-error-page>/login/loginError.jsp</form-error-page>
  </form-login-config>
</login-config>

<security-role>
  <role-name>Employee</role-name>
</security-role>

1 个答案:

答案 0 :(得分:1)

我认为JSESSIONID cookie用于识别客户端,如Servlet Specification (PDF)中所定义:

  

通过HTTP Cookie进行会话跟踪是最常用的会话跟踪机制   并且需要所有servlet容器都支持。   容器向客户端发送cookie。然后客户端将返回cookie   每个后续的服务器请求,明确地将请求与a关联   会话。会话跟踪cookie的标准名称必须是JSESSIONID,   所有3.0兼容容器必须支持。容器可能允许   要通过特定于容器自定义的会话跟踪cookie的名称   配置。

查看Tomcat中如何进行身份验证,执行登录后,调用org.apache.catalina.authenticator.AuthenticatorBase#register(org.apache.catalina.connector.Request, javax.servlet.http.HttpServletResponse, java.security.Principal, java.lang.String, java.lang.String, java.lang.String, boolean, boolean)方法,该方法缓存身份验证信息,org.apache.catalina.authenticator.AuthenticatorBase#checkForCachedAuthentication中的后续请求将重用该方法,以允许经过身份验证的用户继续,无需再次提供凭证。

这意味着虽然用户不必通过身份验证即可拥有有效会话(由JSESSIONID cookie标识),但一旦他们登录,他们的身份验证信息就会被缓存并绑定到他们的会话,所以当用户发出新请求时,应用程序服务器将其识别为已通过身份验证,并允许访问受保护资源。