通过读acegi的源码,更加体会到“基于接口”的设计给扩展带来巨大的灵活性。
在bean配置中,有以下内容:
<bean id="daoAuthenticationProvider" class="net.sf.acegisecurity.providers.dao.PasswordDaoAuthenticationProvider">
<property name="passwordAuthenticationDao"><ref bean="userDAO"/></property>
<property name="userCache"><ref local="userCache"/></property>
</bean>
这个userCache,acegi给出了一个默认的EhCache的实现,如果你不设该属性,默认使用NullUserCache,用户登录后,每进入一个url,系统都会通过Dao访问一次数据库,来取得新的UserDetail,我自己的系统中持久层使用ibatis作映射,而ibatis有自已的基于配置的cache manager,根据自己搞的demo的log信息,确定了,在user.xml中给ibatis的select子句配置缓存模式后,完全不必再给上述的bean注入userCache属性了,当修改用户信息时会同时清除缓存信息。
这点和我们平时的设计思路好象不同,我们一般的设计是,一个用户登录后,将其User Info Bean置入session中,随用随取,这个big bean包括了相关的细节信息以及角色集合。而acegi的“认证“与”授权“是分开的,它只在session中存了key的部分,具体需要用到对象时去缓存中拿。
感谢spring,感谢acegi。