论坛首页 Java企业应用论坛

J2EE安全问题

浏览 5502 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-12-16  

经过今天一天的研究,大概对于J2EE规范有了个思路,主要的技术要素大概是这么个关系,不知道对不对,我想应该问一下专家。

主要参考的书是罗时飞的《敏捷AcegiCAS——构建安全的Java系统》,由于本文多次引用该书,因此以下简称[07]

J2EE规范

我阅读了JSR-115Java Authorization Contract for Containers),以下是对于该规范的简介(我不知道是不是这个规范就是J2EE安全方面的所有规范):

The contract defined by this specification is divided into three subcontracts. Taken together, these subcontracts describe the installation and configuration of authorization providers such that they will be used by containers in performing their access decisions. The three subcontracts are the Provider Configuration Subcontract, the Policy Configuration Subcontract, and the Policy Decision and Enforcement Subcontract.

我的理解是,其主要是定义了一些安全概念,JAAS InterfaceJAAS Provider,还有如何为ServletEJB等提供安全服务。

<o:p> </o:p>

       这篇叫做J2EE中的安全第一部分介绍了J2EE中的概念,体系结构(声明式,编程式)和认证模型(基于HTTP请求,基于表单,基于摘要(Digest),基于.X509证书)。

<o:p> </o:p>

我主要研究了WebSphereWebLogicAcegiJ2EE规范的关系,觉得似乎这三者首先都包含了对于规范的实现,比如如何进行基于HTTP请求的认证。而且三者都超越了规范。

WebLogic安全框架和Acegi都存在对于J2EE容器提供的API的一定程度的封装和抽象。

<o:p> </o:p>

关于JAAS,这个是J2SE规范中定义的Java认证和授权服务,在J2EE中由容器对于其进行了封装;它和Acegi的关系可以看作是替代关系,使用JAAS定义的LoginModule实现类来完成认证,当然为了保持一致性可以通过AcegiJaasAuthenticationProvider将用户认证请求转给JAAS;使用Acegi,就用SecurityContextLoginModule。这是参照[ 07]的说法。对于AcegiJAAS的认识还都比较初级,所以概念上也不知道对不对。

<o:p> </o:p>

<o:p> </o:p>

J2EE认证与授权

认证和授权是两件事,从我看的资料的角度来说,有以下想法:

1.         过去我们的做法:无论是使用ASPDelphiJSP,都是在数据库建一张用户表,一张权限表。认证包括登录时,对比输入的和数据库中的用户名、密码;进入某个功能模块时,或者进行某个操作时,到权限表中查看是否具有这个权限。

2.         J2EE规范的做法:

1)        对于过去所说的用户表,按照IBM WAS的文档说法叫用户注册表,来源有三个:Local OSLDAP和用户自定义注册表(需要实现UserRegistry接口)。在这里提到了LDAP,按照OpenLDAP管理员手册的说法,LDAP是优化访问的数据库。所谓优化,一是专门为了读操作远大于写操作的需求作了优化;二是对于树的操作做了优化。而用户,组,角色,正好符合这种数据结构。

2)        所谓认证,就是从上述三种用户注册表中查找对应的用户

3)        J2EE容器提供了进行配置,就可以自动认证的能力。如果不这样,可以用Acegi来做。两者又是互斥关系。当然可以利用Acegi来封装不同容器的细节差异。

4)        所谓授权,则是读取授权文件,还有不少授权类,这些文件和类和用户邦定在一起,使用容器则部署在容器相应的文件中,比如web.xml。如果使用Acegi,则写在Spring配置文件中。而且使用Acegi,还提供了从数据库中取得授权信息的能力。

5)        这些访问控制,主要是基于对象的,也就是说某个角色是否可以访问某个JSP页面或Servlet,是否可以访问EJB某个方法,是否可以访问某个类。J2EE容器只支持保护EJB方法,不支持POJO领域对象,而Acegi提供了这种支持。

6)        看《JAVA核心技术》的安全部分,主要讲的包括Java自身的安全性(类型检查之类的),类加载器,对于某段代码的访问控制。

7)        WAS的文档,一部分讲的似乎又是J2EE服务器本身的安全性,比如对于进入控制台的控制。

<o:p> </o:p>

那么我的疑问是:<o:p></o:p>

1.         是不是J2EE规范中的访问控制(认证和授权)就是指:对于授权的用户和角色,它是否可以访问编写的某段代码(EJBPOJO的业务方法,领域对象中的持久化对象(实体BeanPOJO))?还包括对于代码的保护,比如不能被人随意篡改?<o:p></o:p>

2.         基于某些帖子的讨论,觉得似乎J2EE访问控制和对于业务的操作控制是两回事。比如,初级会员在javaeye上只能发帖,不能打分,这样的权限控制就和JAAS之类的东西没关系了;还有比如用户登录到一个Java客户端,他只能看到他可以操作的那些功能菜单或按钮(将控件的可见性设为false),这些也和JAAS之类的东西没关系了。这些使用J2EE规范或Acegi都是解决不了的问题?<o:p></o:p>

3.         J2EE规范(比如JAAC)或者是Acegi可以给我们提供多种认证的选择:用户名/密码方式或各种证书? <o:p></o:p>

<o:p> </o:p>

J2EE加密传输

这也是J2EE规范中定义好的一大部分重要内容,比如JSR-154中对于HTTPSSSLTLS)的支持,还有对于MD5SHA-I的加密算法的支持,公钥秘钥等的支持。

我的问题是:<o:p></o:p>

J2EE容器中,比如WAS中,是不是就可以直接利用其基础设施来实现加密传输呢?不需要直接调用J2SEAPI了吧。<o:p></o:p>

LDAP

 其作用主要就是提供用户注册表(就是以前应用中用的USER表,不过我们自己用的USER表里还包括照片之类的,不过那应该算作人员信息表,而不是USER表了)。

我的问题是:<o:p></o:p>

1.         如果对多个系统(异构平台)进行整合,是不是意味着只是从LDAP里获得个账户信息就可以了,简单而言就是用户名和密码。<o:p></o:p>

2.         是否不再需要给每个系统建立USER表了?还有做法是LDAP分为主和节点,每个系统也都使用LDAP,不过如果每个系统用户不多,似乎就没这个必要了。<o:p></o:p>

单点登录(SSO

     WASWebogic都能提供自带的单点登录,方法基本上就是基于Cookie和基于共享Session的。而且只能用于都是J2EE服务的情况下。

 

     那么对于异构平台的系统的SSO解决方案,似乎是要依靠CAS了。

http://blog.csdn.net/lwsolos/archive/2006/07/04/876796.aspx,这篇文章对于SSO进行了一些总结,讲述了实现的方法。

     我的问题是:

1.         利用JA-SIG CAS(基于Token的)可以解决异构平台的SSO问题吗?看网上有人说利用Web ServiceCAS实现了。这种方法是否可行呢?<o:p></o:p>

2.         CAS要借助于LDAP,获得用户信息,然后制作凭证?是这样吗?觉得似乎用了CAS就不需要LDAP了。

   发表时间:2008-06-01  
你多看一寫acegi的資料,就會明白很多
0 请登录后投票
   发表时间:2008-08-26  
楼上的朋友给推荐一些嘛

1.jaas应该没有“对于代码的保护”功能。这是不是已经超出了jaas范畴了?属于操作系统如何防黑客吧?

2.jaas不是专为B/S架构java应用制定的规范,我觉得它更偏向于底层安全机制。比如典型的CallbackHandler + Callbacks处理形式完全不适用于表单提交用户名密码的B/S架构,所以才有流行的:(new CallbackHandler(username,password)).handle(Callbacks[])这种变通处理方式。

3.是啊

总之jaas这套API真是相当的烂,也不见有什么改进的趋势,要说jaas只包含最核心的安全概念(为此jaas连User接口都没有),但是却又连CallbackHandler + Callbacks这种细节都定义,我觉得这完全让用户自己去实现好了啊,只要能获得认证的必要信息不就达到目的了吗。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics