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(具体看例子)
[] [] [] [] [] []