首    页 建模架构 设计模式 培训咨询 jdon框架 论坛

AOP与权限控制实现

板桥里人 http://www.jdon.com 2004/01/10

  以往在J2EE系统中,访问权限控制系统的实现主要有两种:应用程序实现和J2EE容器实现。

 

传统的应用程序实现

 

  这是最直接的、传统的一种解决方式,通常是在具体方法前加一个权限判断语句,如下:

 

 

 

public class ForumFactoryProxy extends ForumFactory {
  ......
  public Forum createForum(String name, String description)
    throws UnauthorizedException, ForumAlreadyExistsException
  {
    if (permissions.get(ForumPermissions.SYSTEM_ADMIN)) {
      Forum newForum = factory.createForum(name, description);
      return new ForumProxy(newForum, authorization, permissions);
    }else {
      throw new UnauthorizedException();
    }
  }
  ......
}

  上述代码是Jive论坛中一段创建论坛功能的代码,在创建论坛前,首先进行权限角色检验,如果当前用户是系统管理员,那么可以实现真正的创建。

  这种在具体功能前加入权限操作检验的实现方式有很多缺点:
  1.每个功能类都需要相应的权限检验代码,将程序功能和权限检验混淆在一起,存在紧密的耦合性,扩展修改难度大。
  2.如果类似Jive,以代理模式为每个功能类实现一个相应的代理类,虽然解耦了程序功能和权限检验,但是,从某个角色的权限检验这个切面考虑,涉及具体Proxy类太多,扩展修改难度大。

J2EE容器实现

  在AOP概念没有诞生前,J2EE规范已经提供了关于权限控制的容器实现标准,这种变迁结果如下图所示:

  原来需要每个应用程序实现的权限Proxy转为整个容器的Proxy实现,其中JDK1.3以后的动态代理API为这种转换实现提供了技术保证。

  非常明显,通过容器实现权限控制验证可以大大简化应用程序的设计,分离了应用系统的权限关注,将权限控制变成了对J2EE容器服务器的配置工作,具体技术细节参考我的书籍《Java实用系统开发指南》第六章。

  其实,容器的权限实现也是一种从一个切面来解决问题方式,AOP概念诞生后,权限控制实现由此也带来了两个方向的变化:
  1. J2EE容器级别的权限实现,也就是容器自身的权限实现。
  2. J2EE应用程序级别的权限实现。

  权限控制在容器级别实现似乎使得J2EE开发者感觉没有灵活性和可扩展性,其实象JBoss 4.0这样的J2EE容器,由于引入了AOP概念,使得J2EE开发者在自己的应用系统中能够直接操纵容器的一些行为。容器和应用系统由于AOP引入的Aspect切面,变得可以成为一体了。(如果使用BEA的EJBC编辑要浪费多少时间?)

  对于J2EE应用系统开发者,能够做到上述境界,必须的条件是对JBoss之类J2EE容器必须有足够的了解,因为这些方式并不是J2EE标准,有可能在移植到新的J2EE容器,这些知识和投入变得无用(也有可能将来J2EE扩展其标准)。

  很显然,使用AOP实现J2EE应用系统级别的权限控制,是解决上述移植风险的一个主要方法,但是带来的缺点是必须亲自从零开始做起,耗费时间不会很短。

AOP下的应用程序权限控制实现

  引入AOP概念后的权限实现已经不是前面Jive实例那样“落后”,我们对这个实例进行重整(Refactorying)如下:

创建一个Aspect,专门用于权限检查,如下:

private static aspect PermissionCheckAspect {

  private pointcut permissionCheckedExecution() :
   execution ( public Forum ForumFactory.createForum(String , String ));

  before () : permissionCheckedExecution() {
    if !(permissions.get(ForumPermissions.SYSTEM_ADMIN)) {
      throw new UnauthorizedException();
    }
   }

}

该段代码功能是:当系统运行ForumFactory.createForum方法之前,将首先检查是否有权限操作。

代码中pointcut触发的条件是createForum方法执行,如果有其它需要系统管理员身份才能执行的方法加入,将写成如下代码:

private pointcut permissionCheckedExecution() :
   execution ( public Forum ForumFactory.createForum(String , String )) ||
   execution ( public Forum ForumFactory.deleteForum(String , String )) ||
   ......
   execution ( public Forum ForumFactory.deleteThread(String , String ));

这些方法陈列比较琐碎,依据AspectJ语法,可以简化如下:
private pointcut permissionCheckedExecution() :
   execution ( public * ForumFactory .*(..));

有兴趣者可以将Jive论坛中相关权限Proxy部分使用AOP重整,另外,由于Jive没有引入角色概念,导致权限和用户HardCode在编码中,如何实现权限和用户解耦,最小限度的降低HardCode量,角色概念在其中起着不可忽视的重要作用。这是另外一个研究课题了。

国人最早开源IOC/AOP框架JdonFramework

AOP权限拦截器在JiveJdon中应用源码

Decorator模式、BUG和AOP

AOP是什么?

AOP详解和AspectJ

 

发表讨论

更多权限专题

更多AOP专题

更多关于AOP讨论

 


更多标签...



Jdon框架演示

JiveJdon
源码下载

VIP收费区

历史热点讨论排行榜




google yahoo 新浪ViVi 365Key网摘 天极网摘 CSDN网摘 添加到百度搜藏 POCO网摘





手机 add to google add to yahoo
联系我们 | 关于我们 | 广告联系 | 网站地图 | 设为首页

沪ICP证08026060 如有意见请与我们联系 Powered by JdonFramework
_×
您有新消息