v 安全验证
Ø 身份验证(authentication):建立一种机制,以确定一个用户确实是他所声称的那个人。
Ø 访问控制,或授权(authorization):与身份验证紧密相关的安全机制,保证用户只能。
v 身份验证
Ø 由容器提供的身份验证
Servlet规范(2.2开始)定义了3种身份验证机制,大部分web客户机和服务器都支持
这3种机制。
i) HTTP基本身份验证
当浏览器请求访问受保护的资源时,服务器将发回索要用户身份证明(用户名和密码)的应答。浏览器提示用户输入这些信息,并再次发送相同的请求,并在请求首部加入了用户的身份证明,这样服务器就可以对这个用户进行身份验证了。
这种验证,用户名和密码并没有被加密,而只是用人们熟悉的Base64编码处理。
ii) HTTP摘要身份验证
它同HTTP基本身份验证的处理方式相同,只是在服务器发送索要验证信息的应答
中还会发送一个称为nonce的字符串(该字符串由服务器唯一生成,包括一个时间
戳、被请求资源的信息和一个服务器标识符),浏览器生成一个包含用户名、密码、
收到的nonce值和被MD5加密的URI的请求,浏览器生成的生成的这个请求信息
被称作“摘要信息”。HTTP摘要身份验证和HTTP基本身份验证相比提高了安全
性,但它还没有得到当前的web客户端和服务器的广泛的支持。
iii) HTTPS客户身份验证
® HTTPS客户身份验证是当前所能支持的最可靠的身份验证机制,这种机制要求用户持有一个PKC(Public Key Certificate,公共密钥证书),当客户端和服务器之间建立起了连接时,这个证书通过一个非常安全的质询——应答的过程发送给服务器,服务器将使用这个证书来唯一的识别该用户。
ª 以上3种机制都是internet标准定义的。这3种机制通常有web服务器自己来实现的,而不是由servlet容器实现的。Servlet规范只定义了一个应用程序如何访问信息结果的规则,而这些结果是进行了用户身份验证的。
iv) 表单的身份验证和
这种身份验证是servlet规范所独有的,并由servlet容器自己实现的
出于同样的原因,表单的身份验证和HTTP基本身份验证一样都不可靠,用户的身
份信息将以纯文本的形式在网络上传输。所以为了保护敏感的资源,必须用SSL(SecureSocketsLayer,安全套结字)这样的加密机制来完成安全管理。
这种机制允许你控制登陆页面的外观。登陆页面是一个带有表单的普通HTML文件,其中包括两个必须的字段,j_username和j_password,而且action属性被设为字符串j_security_check。
<form method=”POST” action=”j_security_check”>
<input type=”text” name=”j_username”>
<input type=”password” name=”j_password”>
</form>
这种机制和基本身份验证一样,当浏览器请求访问受保护的资源时,将显示出登陆表单,action属性的值j_security_check是一个特殊的URL,容器将识别这个URI。
v 对web资源进行访问控制
ª 容器控制的身份验证
Servlet规范定义的安全机制阐述了为一个web应用程序指定访问控制约束,但访问权限是赋予角色(role)的,而不是直接赋予某个用户或用户组的。在特定服务器上,真实的用户名和用户组名会映射到应用程序中的角色名上。
对web应用程序的资源的访问控制的类型是在web应用程序配置描述符(WEB-INF/web.xml文件)中定义的。配置描述符的格式是由servlet规范定义的的,所以所有兼容servlet的容器都支持这种类型的安区配置。
例:
<security-constraint>
<!—web-resource-collection定义了要保护的资源-->
<web-resource-collection>
<web-resource-name>admin<web-resource-name>
<web-resource-name>user<web-resource-name>
<url-pattern>/WEB-INF/pages/*</url-pattern>
</web-resource-collection>
<!--auth-constraint定义了谁能访问受保护的资源,这这里定义只有admin角色才能
访问受保护的资源
-->
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
<!--login-config定义了要使用的验证类型-->
<login-config>
<!--auth-method接受的值包括:BASIC、DIGEST、FORM、CLIENT—CERT-->
<auth-method>BASIC</auth-method>
<!--realm-name:领域名,可以为任何文本,该信息作为认证对话框的一部分显示-->
<realm-name>Security Example</real-name>
</login-config>
<!--security-role声明在容器的安全域内必须被映射到用户和用户组的所有角色的名称
-->
<security-role>
<role-name>admin</role-name>
</security-role>
<security-role>
<role-name>user</role-name>
</security-role>
如果使用表单的身份验证,那么必须在<login-config>元素中指定你的登陆表单和错误页面的名称。
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/loginError.jsp</form-error-page>
</form-login-config>
</login-config>
通过使用配制描述符中的安全性需求的声明,web服务器和servlet容器就可以帮助你处理所有的身份验证和访问控制了。