Acegi是基於Spring的一個開源的安全認證框架現在的最新版本是Acegi的特點就是有很多的過濾器不過我們也用不到這麼多的過濾器只是可以把它們看作為一個個的模塊在用的時候加上自己用的著的即可由於認證的流程的方面比較復雜導致它的配置很復雜如果能摸清它的工作原理還是不太難下面用比較順著人思維的流程過一遍
這裡只列出常用的過濾器和攔載器
過濾器HttpSessionContextIntegrationFilterauthenticationProcessingFilterBasicProcessingFilterRememberMeProcessingFilteranonymousProcessingFilterexceptionTranslationFilter
攔截器filterSecurityInterceptor(其實它是過濾器不過把它放在這裡更能說明它的功能)methodSecurityInterceptor看著上面的用紅色標出的過濾器是用來認證(表單和HTTP基本認證當然還有別的不過這兩個比較長用)它們是資源訪問的入口其它的過濾器是用來輔助的HttpSessionContextIntegrationFilter是用來把認證信息記錄到Session中的RememberMeProcessingFilter是以cookie的形式來保存認證信息的 anonymousProcessingFilter是在匿名的時候(這時候是沒有認證信息的)給這個用戶分配一個匿名的認證信息exceptionTranslationFilter總結一下異常並處理在實際中選擇適合程序的即可
上面只是資源訪問的入口真正保護資源的是這兩個攔截器filterSecurityInterceptor攔截URL的類(它是個過濾器)
metohdSecurityInterceptor攔截類中方法的調用它們為什麼要攔截呢?就是想在訪問或調用這些方法之前來判斷一下用戶是否有訪問或調用的權限有就通過沒有就踢出
除此之外Acegi專門做了兩個管理器(實際上就是兩個類為什麼會用做這兩個管理器因為認證和授權都有一些的操作這就需要專門做兩個管理器了)authenticationManager(class= orgacegisecurityprovidersProviderManager)授權管理器accessDecisionManager(class=orgacegisecurityvoteAffirmativeBased)
說白了一個用於認證用戶一個是用於權限的授於的先來說認證用戶認證管理器有什麼東西呢?只內置了一些提供者這些提供者呢又是什麼呢他們是提供用戶的驗證身份信息的比如從數據庫或配置文件裡讀出用戶名和密碼在用戶的cookie裡讀出身份信息(rememberMeProcessingFilter用到的[前面講了的有印象吧])或在Session裡讀出身份驗證信息(HttpSessionContextIntegrationFilter起作用的)這裡我們只說一下從數據庫或配置文件裡讀出用戶名密碼來裝配驗證信息的其它的配置類似可以找一下對應api在Spring裡配置即可daoAuthenticationProvider是數據庫的提供者class=orgacegisecurityprovidersdaoDaoAuthenticationProvider而它提供的服務呢又有幾種數據庫和配置文件(這是Acegi的兩個默認的實現)當然也可以自己實現(實現userDetailsService接口就行)
<bean id=authenticationManager class=orgacegisecurityprovidersProviderManager>
<property name=providers>
<list>
<ref local=daoAuthenticationProvider/>
</list>
</property>
</bean>
<bean id=daoAuthenticationProvider class=orgacegisecurityprovidersdaoDaoAuthenticationProvider>
<! <property name=userDetailsService><ref local=InMemoryDaoImpl/></property> ><! 這裡有兩種選擇 >
<property name=userDetailsService><ref local=jdbcDaoImpl/></property>
</bean>
如果用戶名和密碼在配置文件裡可以用InMemoryDaoImplclass=orgacegisecurityuserdetailsmemoryInMemoryDaoImpl在這個類的userMap裡配置即可javafish=javaROLE_USER配置了一個用戶名為javafish密碼為java用戶組為ROLE_USER的用戶不過最常用的還是數據庫的JDBC實現(兩個二選一)orgacegisecurityuserdetailsjdbcJdbcDaoImpl裡面需要usersByUsernameQuery和authoritiesByUsernameQuery還有數據源dataSource(有人問為什麼呢userByUsernameQuery是用來通過用戶名來查密碼的authoritiesByUsernameQuery是用來通過用戶名來查權限的查詢數據庫肯定的用數據源吧這個裡是用的SpringFrameWork的DataSource)它們查詢的sql語句是有講究的就是查密碼的時候查三個第一個是username第二個是password第三個是是否可用查權限的時候查兩個username和authorities(具體看例子)
[] [] [] [] [] []
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28997.html