(转)基于Weblogic Security Framework的J2EE通用访问控制系统的设计

标题:基于Weblogic Security Framework的J2EE通用访问控制系统的设计
[评论]


摘要:
一个实际的应用系统除了需要关注于功能需求之外,还需要考虑很多非功能性需求,安全性就是其中一个非常重要的方面。访问控制是几乎所有的应用系统都不可缺少的一部分。
虽然J2EE架构提供了一套安全机制来帮助应用程序实现访问控制,然而过于粗糙的控制粒度使得其使用价值几乎为零,为此各个应用系统不得不各自开发自己的访问控制模块。
然而各个应用系统单独使用各自开发的访问控制模块有着诸多的不利影响。
本文将描述一个基于开放的Weblogic Security Framework的J2EE通用访问控制模块,这样既可以极大的提高应用系统构建速度也可以减少企业浪费在用户管理上的精力。

目录:
一、背景
二、设计目标
三、系统设计
1. 架构概览
2. 实体关系
3. 应用系统接口层的设计
4. 管理工具的设计
5. API层的设计
6. 数据访问层的设计
7. 数据存储层的设计
四、不足与问题
五、总结
六、参考文档
关于作者

一、背景(目录)
一个实际的应用系统除了需要关注于功能需求之外,还需要考虑很多非功能性需求,安全性就是其中一个非常重要的方面。访问控制是几乎所有的应用系统都不可缺少的一部分。
虽然J2EE架构提供了一套安全机制来帮助应用程序实现访问控制,然而过于粗糙的控制粒度使得其使用价值几乎为零,为此各个应用系统不得不各自开发自己的访问控制模块。
然而各个应用系统单独使用各自开发的访问控制模块有着诸多的不利影响,
1. 不利于应用系统的构建速度。每开发一个新的系统都需要重新开发一个访问控制模块。
2. 不利于企业集中管理各个应用系统的账号及权限。每个应用系统使用各自的访问控制模块使得企业需要维护数目众多的用户信息,一方面造成信息冗余,另一方面也难以维护用户信息,为安全带来隐患。
因此,有必要创建一个通用的访问控制模块,这样既可以极大的提高应用系统构建速度也可以减少企业浪费在用户管理上的精力。

二、设计目标(目录)
1. 支持用户认证与授权,用户信息管理。
2. 通用性。该模块应该能够容易地被不同的J2EE应用系统所采用,使得多个系统可以采用同一套用户认证与授权机制完成访问控制。
3. 集中管理与分级管理相结合。所有用户信息和访问控制相关的设定都应该集中控制,同时允许不同级别的管理员根据授权管理各自范围内的资源。
4. 可扩展性。该模块应该能够容易的扩展新的访问控制属性。
5. 低侵入性。采用声明式访问控制,无需在业务代码中添加访问控制语句。然而为了某些局部访问控制的需要,同时提供编程式访问控制。
6. 易用性。该模块应该容易被开发人员和管理人员理解与使用。

三、系统设计(目录)
1. 架构概览

在这个通用访问控制模块里,API层(蓝色)是核心,该层次负责查询数据存储,响应应用系统接口层(黑色)关于访问控制信息的查询和操作。应用程序也可能通过编程性访问控制直接与API层交互。

应用系统接口层(黑色)是提供给应用系统使用的。应用系统利用这一层次的功能完成具体资源的访问控制。在这一层次里,还提供了一些工具用于管理和配置资源的访问控制信息。

数据访问层(粉色)负责访问具体的数据存储,比如LDAP Server,数据库,XML文件等等,在这一层次上可以插接不同的数据访问器以适应不同的数据存储形式。

数据存储层(绿色)则是实际保存访问控制信息的物理载体。

2. 实体关系(目录)

我们把一个应用系统权限控制中所涉及的实体分为三个部分:资源、应用、和用户。
资源分为功能性资源和业务性资源,功能性资源是指某个URL或者EJB的某个业务方法这类应用程序的功能部件。业务性资源则是指应用程序所操作的数据或其他对象。一个应用程序所有resource的集合构成了一个domain。在domain里,一组resource的ACL(访问控制列表)的集合构成了一个realm。一个应用程序可以订阅一个realm的资源来实现对资源访问的控制。

应用部分的主体是Application,Vendor做为Application的提供商可以用来组织Application。Application可以划分为若干module,每个module对应若干action(操作),定义在resource上的ACL(访问控制列表)则定义了资源与Action的需求关系。定义在module下的role则是该module下action的组织方式。

用户部分从Organization到department到user都是按照实际的行政划分来组织用户。Group则是一种补充的逻辑划分。User与Role的联系则是RBAC(Role Based Access Control基于角色的权限控制)思想的具体实现。RBAC是解决复杂多变的企业权限管理的有效手段,它可以减小权限管理的复杂性,并且能够灵活的定制和更改安全策略,具有良好的伸缩性。Role与group的联系并不是一种稳定的联系,需要通过User来实现,提供这种role与group间的联系是为了方便批量的role的赋权与撤销。organization通过订阅application来实现用户与操作的联系。

3. 应用系统接口层的设计(目录)
传统web应用程序的访问控制可以通过使用servlet filter拦截请求来完成。对于Web应用程序来说,这种方式工作得非常好,但是对于非web资源,比如EJB,这种方式则起不到作用。

对于EJB,也可以使用某种proxy方式来代理访问,以实现访问控制,但是这种方式对应用程序具有侵入性,应用程序必须显式的使用proxy才行。
以上两种方式的局限性都在于仅仅对某一种资源起到访问控制的作用。不能对整个J2EE系统内的资源以一种统一的方式进行访问控制。

Weblogic Security Framework是一个开放的,灵活的安全框架,它除了适用于Web资源和EJB,还可以作用于JDBC connection pools,JMS destinations,JNDI和JCA Adapters等所有的J2EE资源。最为关键的是它不但向应用系统提供了一个统一的安全界面,同时还提供了一种扩展机制,使你可以定制自己的访问控制规则。

Weblogic Security Framework的架构如下图所示

(来源:BEA White Paper - BEA WebLogic Security Framework:Working with Your Security Eco-System)

当访问受保护的资源时,Weblogic Security Framework就会被激活,因此通过标准的J2EE安全机制,在部署描述符里定义受保护的资源,就可以启用我们的访问控制系统。
比如在web.xml中如下的语句定义了protect.jsp为受保护的资源,则在访问此资源时Weblogic Security Framework将被触发。
<security-constraint>
<web-resource-collection>
<web-resource-name>Success</web-resource-name>
<url-pattern>/protect.jsp</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>WeblogicUser</role-name>
</auth-constraint>
</security-constraint>

类似的,定义在ejb-jar.xml中的如下语句则定义了EJB的denyMethod方法为受保护的方法,在client试图访问此方法时,也将触发Weblogic Security Framework进行检验。
<method-permission>
<role-name>admin</role-name>
<method>
<ejb-name>Hello</ejb-name>
<method-name>denyMethod</method-name>
</method>
</method-permission>

当然由于使用自己定制的security provider,这些资源限制里所涉及的role-name只是一个虚设的值,它将被忽略,而使用定义在我们的数据存储中的用户与role的对应关系。而web.xml中设定的login-error-page也将根据设置被替换,验证失败时用户将看到更加丰富的定制信息。

下图所示的是一个用户登录时所触发的授权机制。

(来源:e-docs.bea.com Developing Security Providers for WebLogic Server)

下图所示的是一个受保护的资源是如何与Weblogic Security Framework交互,以及Security Provider是如何发生作用的。


(来源:e-docs.bea.com Developing Security Providers for WebLogic Server)

通过替换Weblogic默认的Security Provider为自定义的Security Provider,就可以实现我们自己的访问控制。在这个系统里,仅仅实现Authentication Provider和Authorization Provider就基本上能够满足需求了。

4. 管理工具的设计(目录)
除了可以开发一个单独的应用程序来管理所有的访问控制资源之外,Weblogic还提供了一种叫做Administration Console Extension机制,可以让我们把应用程序嵌入到Weblogic 的console中去,虽然这么做的确是很cool,但是却不利于授权的分层管理,因此单独的管理工具还是必须的。

5. API层的设计(目录)
在API层中,除了需要实现实体外,还需要设计提供给应用系统接口层的API,包括两部分,一部分用于实现管理的API,也就是实体类的增、删、改和查询;另一部分用于实现用户认证与授权的API,这一部分至少需要如下的API,
AuthenticateManager.authenticateUser(String userNmae, String password):UserInfo
用于检验用户的登录
AuthorizationManager.isProtectedResource(String resourceId):Boolean
用于测试资源是否受需要访问授权
AuthorizationManager.isAccessAllowed(String resourceId, String userName):boolean
用于测试资源是否能够被用户访问

6. 数据访问层的设计(目录)
数据访问层必须可以允许插接不同的数据访问器以适应不同的数据存储形式,可以运用bridge模式+抽象工厂模式来实现这一点。

数据管理类比如UserInfoManager首先根据外部的设定值获得一个具体的AccessorFactory,比如LDAPAccessoryFactory,然后使用这个具体的LDAPAccessoryFactory创建相应的Accessor来访问物理存储。

7. 数据存储层的设计(目录)
尽管可以使用多种存储方式来保存访问控制信息,但是LDAP无疑是最适合的存储方式。我们的设计将提供一个基于LDAP的方案。
Weblogic Server里内嵌了一个LDAP server,但是其功能实在是过于简陋,不支持LDAP schema的扩展,因此并不能满足我们的需求。因此在这里我们将使用一个功能完整的LDAP server - SunOne Directory Server来表达设计,当然你可以把它移植到其他LDAP Server上去,比如免费的OpenLDAP server。

创建如下的attribute
djrole DirectoryString MultiValue
djaction DirectoryString MultiValue
djsubscribedapp DirectoryString MultiValue
djsubscribedrealm DirectoryString

创建如下的object class
djapplication parent top required attribute cn allowed attribute djsubscribedrealm
djappmodule parent top allowed attribute djrole, djaction
djdepartment parent organizationalunit
djdomain parent organizationalunit
djgroup parent organizationalunit attribute djrole
djorganization parent organizationalunit allowed attribute djsubscribedapp
djrealm parent top required attribute cn
djresource parent top required attribute cn allowed attribute djaction
djuser parent inetorgperson allowed attribute djrole
djvendor parent organizationalunit

这个schema只能满足最基本的需求,根据需要可以进一步的扩充各个object class的属性。

下图是一个创建在SunOne Directory Server 5.2中的Directory Information Tree。
图中标识出了每个entry所对应的object class。

四、不足与问题(目录)
使用Weblogic Security Framework来拦截对受保护资源的调用,client端收到的响应也只能由Weblogic Security Framework发出,在处理EJB调用时,如果授权失败,client端只能收到一个java.rmi.AccessException,我们无法给出更明确的信息来提示客户端,这将妨碍这个权限控制系统的功能扩展。
用户认证部分仅支持用户名和密码的方式,可能需要进一步扩展以支持更多的认证方式。
此外,这个系统还没有包括审计部分,而审计也是安全管理的一个重要部分。其实Weblogic Security Framework也提供了对审计的扩展,需要时便可以添加。

五、总结(目录)
Weblogic Security Framework以前所未有的开放性与灵活性为实现这样一个通用的J2EE权限管理系统提供了强大的支持。本文所涉及的只是冰山的一角,更多强大的功能还有待大家挖掘。
由于时间的关系,未能完成一个可运行的系统,只是做了一些验证的原型,因此暂时无法将一套可运行的源代码与大家分享。也许在不久的将来,大家会看到一个基于本文的开源系统。

六、参考文档(目录)
[1]Developing Security Providers for WebLogic Server http://e-docs.bea.com/wls/docs81/dvspisec/index.html
[2]BEA WebLogic Security Framework http://www.bea.com/content/news_events/ white_papers/BEA_WL_Server_TechSecurity_wp.pdf

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值