如果你觉得自己写一个安全系统比较累,那建议你试一试Acegi这个开源框架,它与Spring能很好的结合,从多方面保护您的软件系统。
Acegi说穿了也就从两个方面保护资源:
一、是利用Servlet的过滤器,来拦截Servlet的请求
二、是利用Spring的AOP,(其实Servlet的过滤器也是AOP)
先来说说Servlet过滤,Acegi由认证管理器来确定用户身份,Acegi默认提供了一个认证管理器——ProvideManager,ProvideManager的authenticate()方法,认证一个Authentication对象,通过用户名(j_username)和密码(j_password)作为参数进行认证,如果验证通过,将用户名保存在session中。当然,你也可以自己写一个认证管理器来实现一些特殊的功能,不过,你需要实现org.acegisecurity.AuthenticationManager接口:
当然,你需要再Spring的配置文件中,将这个认证管理器加载进来:
<list></list>
- <bean id="authenticationManager"
- class="org.acegisecurity.providers.ProviderManager">
- <property name="providers">
- <list>
- <ref local="daoAuthenticationProvider" />
- <ref local="rememberMeAuthenticationProvider" />
- list>
- property>
- bean>
xml 代码
- <!-- 用户列表 -->
- <bean id="jdbcDaoImpl"
- class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
- <property name="dataSource" ref="dataSource" />
- <property name="usersByUsernameQuery">
- <value>
- SELECT manager_passport, manager_pwd, isuse FROM
- tb_mms_manager WHERE isuse = 1 and manager_passport = ?
- </value>
- </property>
- <property name="authoritiesByUsernameQuery">
- <value>
- SELECT manager_passport,op_code FROM tb_mms_manager m,
- tb_mms_op o, tb_mms_powergroup p WHERE m.power_group =
- p.group_id and p.group_op like '%|' +
- convert(varchar(2),o.op_id) + '|%' and
- m.manager_passport = ?
- </value>
- </property>
- </bean>
usersByUsernameQuery属性验证了用户名和密码,值得一提的是usersByUsernameQuery,必须是三个属性,用户名,密码,以及是否可用,除非你重写这个方法,不然三个属性缺一不可。authoritiesByUsernameQuery列举了该用户的所有权限,这里介绍的所有配置,基本上都是用Acegi默认的类来配置的,如果需要扩展功能,完全可以自己定义类来写。
中提供了一系列认证提供者,比较常用的认证提供者类型有:DaoAuthenticationProvider(从数据库中获取用户信息)、PasswordDaoAuthenticationProvider(让底层数据源完成)等,他们都是实现了AuthenticationProvider接口。该接口定义了与ProvideManager相同的authenticate()方法。
然后定义daoAuthenticationProvider