1.J2EE安全性介绍
说明性的安全性:通过安全结构描述的方式来代表应用程序的安全需求,安全结构一般包括安全角色,访问控制和验证要求等。在j2ee平台中部署描述符充
当了说明的安全性的主要工具。部署描述符是组件开发者和应用程序部署者或应用程序组装者之间的交流工具。应用程序的开发者用它来表示应用中的安全需求,应用程序部署者或应用程序组装者将安全角色与部署环境中的用户和组映射起来。
在程序运行时容器从部署描述符中提取出相应的安全策略,然后容器根据安全策略执行安全验证。说明的安全性不需要开发人员编写任何安全相关的代码,一切都是通过配置部署描述符来完成的。
可编程的安全性: 可编程的安全性在说明性的安全性的基础上,使安全敏感的应用可以通过调用被容器提供的API来对安全作出决断。这在说明性的安全性不足以满足企业的安全模型的情况是非常有用的。比如J2ee在servlet HttpServletRequest interface中各提供两个方法:
isUserInRole (HttpServletRequest)——判断用户角色
getUserPrincipal (HttpServletRequest) ——获得用户认证信息principal
另外,就是用户自定义登录认证,而不是使用J2EE的部署描述符里面的定义(三种登录认证类型)。
2.基于J2EE的认证与授权
提到安全性,就不能不说到两个概念:认证与授权。
认证是用户或计算设备用来验证身份的过程。授权是根据请求用户的身份允许访问和操作一段敏感软件的过程。
这两个概念密不可分。没有授权,
就无需知道用户的身份。没能认证,就不可能区分可信和不可信用户,
更不可能安全地授权访问许多系统部分。
因为之前的项目100% web方式,所以本文只讨论web应用的认证和授权。
A.认证方式:
Web客户端通常通过http协议来请求web服务器端的资源,这些web资源通常包括html网页、jsp(java server
page)文件、java
servlet和其他一些二进制或多媒体文件。在企业环境中,企业的某些资源往往要求只允许某些人访问,有些资源甚至是机密的或安全敏感的。因此对企业中
各种web资源进行访问控制是十分必要的。为了满足企业中的不同安全级别和客户化的需求,J2EE提供了三种基于web客户端的认证方式:
HTTP基本认证(HTTP Basic Authentication)
HTTP基本验证
是HTTP协议所支持的验证机制。这种验证机制使用用户的用户名和密码作为验证信息。Web客户端从用户获取用户名和密码,然后传递他们给web服务
器,web服务器在指定的区域(realm)中验证用户。但需要注意的是,这种验证方法是不够安全的。因为这种验证方法并不对用户密码进行加密,而只是对密码进行基本的base64的编码。而且目标web服务器对用户来说也是非验证过的。不能保证用户访问到的web服务器就是用户希望访问的。
基于表单的认证(Form-Based Authentication)
基于表单的验证
使系统开发者可以自定义用户的登陆页面和报错页面。这种验证方法与基本HTTP的验证方法的唯一区别就在于它可以根据用户的要求制定登陆和出错页面。基于
表单的验证方法同样具有与基本HTTP验证类似的不安全的弱点。用户在表单中填写用户名和密码,而后密码以明文形式在网路中传递,如果在网路的某一节点将
此验证请求截获,在经过反编码很容易就可以获取用户的密码。因此在使用基本HTTP的验证方式和基于表单的验证方法时,一定确定这两种方式的弱点对你的应
用是可接受的。
基于客户端证书的认证(Client-Certificate Authentication)
基于客户端证书的验证方式要比上面两种方式更安全。它通过HTTPS(HTTP over SSL)来保证验证的安全性。安全套接层(Secure
Sockets
Layer)为验证过程提供了数据加密,服务器端认证,信息真实性等方面的安全保证。在此验证方式中,客户端必须提供一个公钥证书,你可以把这个公钥证书
看作是你的数字护照。公钥证书也称数字证书,它是被称作证书授权机构(CA)-一个被信任的组织颁发的。这个数字证书必须符合X509公钥体系结构
(PKI)的标准。如果你指定了这种验证方式,Web服务器将使用客户端提供的数字证书来验证用户的身份。
B.授权模型:
代码授权(Code Authorization)
j2ee产品通过java 2 安全模型来限制特定J2SE的类和方法的执行,以保护和确保操作系统的安全。
调用者授权(Caller Authorization) ——这个是我们常用的方式
安全角色:安全角色是具有相同安全属性的逻辑组。比如是admin,Supervisor等。
用户和组:用户和组是在实际系统环境下的用户和用户的集合。它们对应者现实当中的人和群体。
访问控制:访问控制可以确保安全角色只能访问已授予它安全权限的授权对象。授权对象包括EJB的远程方法、web资源(html网页,jsp/servlet和多媒体或二进制文件)等。在j2ee中访问控制在应用程序描述文件中与安全角色关联起来。
映射:通过映射应用程序的系统管理员将实际系统环境中的用户与安全角色联系起来,从而是实际的用户拥有对企业资源访问的适当授权。
C.部署描述符安全性相关介绍:
安全约束——定义那些资源是受约束访问的,以及认证通过后的授权范围
<security-constraint> //安全约束部分
<web-resource-collection> //受约束的web资源集
<web-resource-name>WRCollection</web-resource-name> //资源集名
<url-pattern>/webtest.jsp</url-pattern> //资源的url表达式
<http-method>GET</http-method> //受约束的资源操作方法
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint> //对安全角色授权
<role-name>user</role-name> //安全角色名
</auth-constraint>
<user-data-constraint>
<transport-guarantee>NONE</transport-guarantee>
</user-data-constraint>
</security-constraint>
定义安全角色
<security-role>
<description>this is a user</description>
<role-name>user</role-name>
</security-role>
基本的HTTP认证方式——使用不多
<login-config> //验证方式设置
<auth-method>BASIC</auth-method> //使用基本的HTTP验证方式
<realm-name></realm-name>
</login-config>
基于表单的认证方式——使用较多
<login-config>
<auth-method>FORM</auth-method> //使用基于表单的验证方式
<realm-name>Default</realm-name> //使用缺省的安全域
<form-login-config>
<form-login-page>/login.html</form-login-page> //定义登陆页面
<form-error-page>/error.html</form-error-page> //定义出错页面
</form-login-config>
</login-config>
基于证书的认证方式——与CA用户数据中心一起使用
<login-config>
<auth-method>CLIENT-CERT</auth-method>
</login-config>
注:后两种均在项目中应用过。
以上三种认证方式都属于配置式登录认证。
还有一种是程序性(编程式)的登录认证,即通过web application自身进行验证,比较典型的是利用过滤器代理操作。
比如开源的acegi,使用它你将无需再web.xml里配置如此多的东西(当然,也多了许多acegi的配置)。
参考 http://www.ibm.com/developerworks/cn/java/l-j2eeSecurity/
企业级Java安全性——构建安全的J2EE应用