什麼是AOP系列之二:AOP與許可權控制實現(轉)

post0發表於2007-09-06
什麼是AOP系列之二:AOP與許可權控制實現(轉)[@more@]

  以往在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容器伺服器的配置工作。其實,容器的許可權實現也是一種從一個切面來解決問題方式,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量,角色概念在其中起著不可忽視的重要作用。

·上一篇:

·下一篇:
 
     最新更新
·

·

·

·

·

·

·WeblogicServer9新特性:J2EELibraries

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·

·使用訊息驅動Beans(3)

·

·

·

·


| | | | | | |

Copyright © 2004 - 2007 All Rights Reserved

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-968189/,如需轉載,請註明出處,否則將追究法律責任。

什麼是AOP系列之二:AOP與許可權控制實現(轉)
請登入後發表評論 登入
全部評論

相關文章