2.7 安全
Servlet通常通过互联网访问,因此其安全需求是通用的。可以使用注解或在web.xml中指定Servlet的安全模型,包括角色、访问控制和认证要求。
@ServletSecurity注解用于指定Servlet的实现类的所有方法或特定的doXXX()方法的安全约束。容器将强制执行相应的doXXX()消息只能由指定角色的用户调用:
在这段代码中,@HttpMethodConstraint注解用于指定doGet()方法可以由R2角色的用户调用,doPost()方法可以由R3和R4角色的用户调用。在@HttpConstraint注解用于指定所有其他方法可以由R1角色的用户调用。角色被映射到安全主体或容器组中。
安全约束也可以在web.xml中的元素中指定。在中,元素用于指定HTTP操作和网络资源的约束,元素用于指定允许访问该资源的角色,元素在其子元素中表明客户端和服务器之间的数据应该以何种方式加以保护:
这个部署描述符只要求/account/*路径下的GET方法是被保护的。该方法只能由manager角色的用户访问,数据传输的约束是INTEGRITY。除了GET方法,其他的所有HTTP方法是不受保护的。
如果HTTP方法没有在security-constraint中列举,由约束定义的保护适用于全部的HTTP(扩展)方法:
在这段代码中,所有的HTTP方法在/account/*路径下都受保护。
当中至少列出一个元素时,没有在该中列出的HTTP协议方法在Servlet 3.1中被定义为未保障的(uncovered):
在这个代码片段中,只有HTTP GET方法是受保护的,而所有其他的HTTP协议方法,如POST和PUT是未保障的。
元素用于指定不受约束保护的HTTP方法清单:
在这段代码中,只有HTTP GET方法是不受保护的,而所有其他的HTTP协议方法受保护。
元素,是Servlet 3.1中的新元素,用于拒绝对未保障的HTTP方法的HTTP方法请求。被拒绝的请求返回一个403(SC_FORBIDDEN)状态码:
在这段代码中,元素确保HTTP GET调用时所需的安全认证,而所有其他的HTTP方法被拒绝,HTTP状态码为403。
@RolesAllowed注解、@DenyAll注解、@PermitAll和@TransportProtected注解提供了另一种为特定的资源或资源方法指定安全角色的方式:
如果注解在类和方法两个级别指定,在该方法中指定的注解覆盖在类中指定的。
Servlet 3.1引入了以下两个新的预定义角色。
-
- 匹配任意已定义的角色。
- ** 匹配任意认证用户的独立角色。
相比在一个特定的角色上指定而言,这使得可以在一个更高的层次上指定安全约束。
最多可以在目标上指定一个@RolesAllowed、@DenyAll或者@PermitAll注解。@TransportProtected注解可以和@RolesAllowed或@PermitAll注解组合使用。
Servlet可以配置为HTTP基本认证、HTTP摘要认证、HTTPS客户端,以及基于表单的认证:
这段代码显示了如何实现基于表单的身份验证。登录表单必须包含输入用户名和密码字段,字段必须分别命名为j_username和j_password。表单的action总是命名为j_security_check。
Servlet的3.1要求密码表单字段的属性autocomplete="off",进一步加强基于Servlet表单的安全性。
HttpServletRequest还提供了编程式的安全方法login()、logout()和authenticate()。
login()方法验证在密码验证领域(具体到一个容器)中提供为ServletContext配置的用户名和密码。这确保了getUserPrincipal()方法、getRemoteUser()方法和getAuthType()方法的返回值有效。login()方法可以作为基于表单登录的替代方法。
authenticate()方法使用为ServletContext配置的容器登录机制来验证当前请求的用户。