Vincent

          Vicent's blog
          隨筆 - 74, 文章 - 0, 評論 - 5, 引用 - 0
          數(shù)據(jù)加載中……

          acegi-security-sample-contacts-filter例子學(xué)習(xí)(二)

          功能實現(xiàn)分析

          這個例子使用了HSQL做數(shù)據(jù)庫,spring的AOP作為基礎(chǔ),使用Acegi做安全控制組件。
          聯(lián)系人管理的web應(yīng)用在啟動時候,會做一系列初始化動作:
          1. 讀取web.xml文件,

          2. 并解析文件里的內(nèi)容。
          a) context-param元素。
          i. contextConfigLocation屬性。這個屬性定義了spring所需要的3個屬性文件。它們分別是:applicationContext -acegi-security.xml、applicationContext-common-business.xml、 applicationContext-common-authorization.xml
          ii. log4jConfigLocation屬性。這個屬性定義了log4j配置文件。

          b) filter元素。
          這里定義了acegi的一個過濾器。Acegi的大部分過濾器都是這樣配置的。使用FilterToBeanProxy組件,給它傳遞一個targetClass屬性。這個targetClass必須實現(xiàn)javax.servlet.Filter接口。
          這里配置的是FilterChainProxy。這個FilterChainProxy比較好用,可以為它定義一串filter屬性。這些filter將會按照定義的順序被調(diào)用。例如,
          <bean id="filterChainProxy" class="net.sf.acegisecurity.util.FilterChainProxy">
          <property name="filterInvocationDefinitionSource">
          <value>
          CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
          PATTERN_TYPE_APACHE_ANT
          /**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,basicProcessingFilter,rememberMeProcessingFilter,anonymousProcessingFilter,securityEnforcementFilter
          </value>
          </property>
          </bean>
          這個過濾器的mapping是“/*”。
          c) listener元素。
          i. ContextLoaderListener。這個是Spring使用來加載根applicationcontext。并分別解析 applicationContext-acegi-security.xml、applicationContext-common- business.xml、applicationContext-common-authorization.xml等配置文件,把相關(guān)的對象初始化
          iii. Log4jConfigListener。這個是spring用來初始化log4j組件的listener。
          iv. HttpSessionEventPublisher。這個組件將發(fā)布HttpSessionCreatedEvent和HttpSessionDestroyedEvent事件給spring的applicationcontext。
          d) servlet元素。
          i. contacts。這里采用了spring的MVC框架, 所以這個servlet是spring MVC的一個核心控制器(org.springframework.web.servlet.DispatcherServlet)。這個servlet 啟動時候,會從contacts-servlet.xml里面讀取信息,并做相關(guān)的初始化。
          v. remoting。也是spring MVC的一個核心控制器。與contacts不同,這個servlet主要是提供web services服務(wù)。這個servlet啟動時候, 會從remoting-servlet.xml里面讀取信息,并做相關(guān)的初始化。
          e) taglib元素。這里定義了spring的標(biāo)f) 簽庫。
          3. 解析applicationContext-acegi-security.xml。
          a) 過濾器鏈。定義了一個FilterChainProxy,b) 并指c) 定了一系列的過濾器鏈。httpSessionContextIntegrationFilter, authenticationProcessingFilter,basicProcessingFilter,rememberMeProcessingFilter,anonymousProcessingFilter,securityEnforcementFilter
          d) 認(rèn)證管理器。這個管理器由acegi提供。這個管理器需要一個providers參數(shù)。這個providers參數(shù)包含了提供系統(tǒng)認(rèn)證的對象。
          i. daoAuthenticationProvider。一般用戶認(rèn)證。
          ii. anonymousAuthenticationProvider。匿名用戶認(rèn)證。
          iv. rememberMeAuthenticationProvider。記住我認(rèn)證。

          e) 密碼加密。這里定義了一個acegi的Md5算法加密對象Md5PasswordEncoder。
          f) 定義了一個jdbcDao實現(xiàn)類。這個類由acegi提供的net.sf.acegisecurity.providers.dao.jdbc.JdbcDaoImpl。這個對象需要一個dataSource的參數(shù)。
          g) 定義daoAuthenticationProvider。這個對象由acegi提供。它有3個屬性:
          authenticationDao。這里指向前面定義的jdbcDao。
          userCache。這里指向后面定義的user緩存對象。
          passwordEncoder。這里指向前面定義的密碼加密對象。
          h) 用戶緩存管理。
          為了緩存user,這里使用spring的ehcache來緩存user。緩存機(jī)制:
          i. 定義緩存管理器――CacheManager。這個對象是spring的EhCacheManagerFactoryBean對象
          ii. 定義user緩存實際執(zhí)行對象――UserCacheBackend。這個對象是spring的EhCacheFactoryBean。它有兩個屬性:
          1. cacheManager。這里指向前面定義的緩存管理器。
          2. cacheName。
          iii. 定義user緩存――UserCache。它是acegi提供的EhCacheBasedUserCache對象。它有一個屬性:
          1. cache。這里指向的是前面定義的userCacheBackend。

          i) 定義接收來自DaoAuthenticationProvider的認(rèn)證事件的listener――LoggerListener。
          j)
          4. 解析applicationContext-common-business.xml。
          a) dataSource.
          這里使用了spring的DriverManagerDataSource對象。這個對象是一個JDBC數(shù)據(jù)源的定義。
          b) TransactionManager。這里使用spring的DataSourceTransactionManager對象。
          c) 事務(wù)攔截器。這里使用spring的事務(wù)攔截器TransactionInterceptor。它有2個屬性:
          transactionManager。這個屬性指向前面定義的TransactionManager。
          transactionAttributeSource。這個屬性里, 指定了ContactManager的各個方法的事務(wù)方面的要求。
          d) DataSourcePopulator。
          使用sample.contact.DataSourcePopulator對象,往HSQL里創(chuàng)建相關(guān)的表結(jié)構(gòu)和數(shù)據(jù)。
          實現(xiàn)原理:DataSourcePopulator 實現(xiàn)了接口 InitializingBean。其中afterPropertiesSet方法將在spring初始化DataSourcePopulator后被調(diào)用。
          e) ContactDao。這里指向一個ContactDaoSpring對象。它繼承spring的 JdbcDaoSupport,g) 并實現(xiàn)ContactDao接口。它是真正實現(xiàn)JDBC操作的對象。
          h) ContactManager。這里使用的是spring的ProxyFactoryBean。它有2個屬性:
          i. ProxyInterfaces。代理接口:sample.contact.ContactManager

          ii. InterceptorNames。攔截器名稱。可以有多個,iv. 這里包括:transactionInterceptor、contactManagerSecurity、contactManagerTarget。其中,v. transactionInterceptor是前面定義的事務(wù)攔截器。ContactManagerSecurity則是在 applicationContext-common-authorization.xml里定義的方法調(diào)用授權(quán)。
          i) ContactManagerTarget。這里指向的是sample.contact.ContactManagerBackend對象。 ContactManagerBackend實現(xiàn)了ContactManager接口和InitializingBean接口。它有2個自定義屬性: contactDao和basicAclExtendedDao。這里會調(diào)用ACL的API去做些創(chuàng)建權(quán)限和刪除權(quán)限的工作。

          posted on 2006-09-01 13:45 Binary 閱讀(892) 評論(0)  編輯  收藏 所屬分類: Acegi


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 洪泽县| 桃源县| 板桥市| 清涧县| 土默特左旗| 定州市| 拜泉县| 卢湾区| 修武县| 鸡东县| 鄄城县| 乌兰察布市| 揭东县| 襄城县| 微博| 平南县| 鹰潭市| 延川县| 夏邑县| 文成县| 萨迦县| 和龙市| 镇原县| 射阳县| 镇平县| 崇州市| 固原市| 霍州市| 闸北区| 乐昌市| 资中县| 安化县| 鹤峰县| 禹城市| 平阴县| 呼和浩特市| 乌拉特前旗| 东乌| 华宁县| 新泰市| 大港区|