JSP虽然不是本书的重点,但是它的相关安全类也是可圈可点的。例如,Authentication利用通信实体验证对方的身份。资源访问控制(Access Control for Resources)技术可以对指定的用户组进行操作,限制用户的某些权限。Data Integrity可以保证数据在传递过程中不被第三方修改。数据授权技术(Confidentiality or Data Privacy)保证数据只被那些授权使用的用户使用。
具体这几种方式的详细介绍如下:
Declarative Security的内容包括角色控制,完成外部表单所要求的输入验证。在网站运行时,servlet框架使用这些策略强制验证。
当Declarative Security不能够完全过滤用户输入和验证角色时,就可以使用代码级安全策略。Programmatic Security包括HttpServletRequest接口的下列方法:
getRemoteUser方法返回经过客户端验证的用户名。IsUserInRole向容器container的安全机制检索特定的用户是否在一个给定的安全角色中。GetUserPrinciple方法返回一个java.security.Pricipal对象。这些APIs根据远程用户的逻辑角色让servlet去完成一些逻辑判断。它也可以让servlet去决定当前用户的权限。如果getRemoteUser返回null值(这意味着没有用户被验证),那么isUserInRole就总会返回false,getUserPrinciple总会返回null。
角色(Roles)是由开发和维护人员所定义的一个抽象的逻辑用户组。当一个网站系统被发布,Deployer就把这些角色映射到安全认证,例如组或规则。
当Deployer把一个安全角色映射为操作环境下的一个用户组,调用安全策略所属的用户组就从安全属性中获得。如果安全策略的用户组与在操作环境下的用户组相匹配,那么安全策略就是一个安全角色。当Deployer把一个安全角色映射为一个在安全域中的安全策略名时,调用安全策略就把角色从安全属性中提取出来。如果两者相同的话,调用的安全策略就是安全的。
JSP的WEB系统能够利用下列的认证机制验证一个用户。
(1)HTTP Digest Authentication。
(2)HTTPS Client Authentication。
(3)HTTP Basic Authentication。
(4)HTTP Based Authentication。
HTTP Basic Authentication是一个定义在HTTP/1.1规范中的验证机制。这种机制是以用户名和密码为基础的。一个JSP系统要求一个Web Client去验证一个用户。作为请求的一部分,Web Server 传递realm的字符串,用户的验证信息就包含在字符串中。Web Client得到这些用户名和密码,然后把它传递给Web Server。然后Web server验证这些用户。
由于密码是使用64位的弱编码来传递的,所以Basic Authentication不是一种安全的验证协议。假如增加(HTTPS)或在网络层使用安全措施就能弥补这些不足。
与HTTP Digest Authentication一样,HTTP Digest Authentication根据用户名和密码验证一个用户。密码的传输是通过一种加密的形式进行的,这就比Basic Authentication所使用的64位编码形式传递要安全得多。但这种方法还是没有HTTPS安全。
使用HTTPS(HTTP over SSL)的用户验证是一种严格验证机制。这种机制要求用户客户端处理公共密钥(Public Key Certification,PKC)。