acegi security实践教程—把用户信息存放到数据库

概括:

前几篇博客中form验证中用户名称、密码都是存在内存中,为了进一步完善,我们把用户基本信息存放到数据库中。
基于内存形式如下:
       <!-- 从数据库中读取用户信息验证身份 -->
     <bean id ="daoAuthenticationProvider"
           class= "org.acegisecurity.providers.dao.DaoAuthenticationProvider" >
            <property name ="userDetailsService" ref= "inMemDaoImpl" />
     </bean >

    <!-- 基于内存实现方式-->
     <bean id ="inMemDaoImpl"
           class= "org.acegisecurity.userdetails.memory.InMemoryDaoImpl" >
            <property name ="userMap">
                 <value >
                     test=1,ROLE_USER
                     lisi=1,ROLE_SUPERVISOR
                     zhangsan=1,ROLE_SUPERVISOR,disabled
                 </value >
            </property >
     </bean >

分析:

根据源码,我们分析到userDetailService的实现类有两个:InMemoryDaoImpl和JdbcDaoImpl,那这篇博客就尝试用JdbcDaoImpl类。

具体开发步骤:

开发环境:MyEclispe10.7.1+tomcat6.0.37+acegi1.0.5+spring2.0
项目目录如下: 其中readme主要用来记录本次验证目的

讲解:

1.根据JdbcDaoImpl源码来配置acegi
通过源码发现,JdbcDaoImpl默认情况下,执行这两个查询。
usersByUsernameQuery根据用户名查询用户基本信息:用户名、密码、是否启用
this.usersByUsernameQuery = "SELECT username,password,enabled FROM users WHERE username = ?";
authoritiesByUsernameQuery根据用户名查询用户权限信息:用户名、角色权限
this.authoritiesByUsernameQuery = "SELECT username,authority FROM authorities WHERE username = ?";
所以,您的数据库中必须有这两个表以及相应的字段。
2.JdbcDaoImpl继承了spring的JdbcDaoSupport类,其中spring的JdbcDaoSuupport类如下:
分析注入dataSource数据源:
通过springJdbcDaoSupport类,是需要注入一个数据源对象。具体了解一下,从源码哪里可以看出需要注入数据源呢,spring的注入配置,主要观察类代码。
根据上图的分析,可以配置,通过jdbcTemplate属性注入dataSource对象。如下配置:

  <bean id="userDetailsService"
class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
<property name="jdbcTemplate" ref="JdbcTemplate"> </property>
</bean>
<bean id="JdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  <property name="dataSource" ref="dataSource"></property>
</bean>

其实根据源码的分析,也可以这么配置,不用jdbcTemplate属性,而是直接注入dataSource对象。
 <bean id="userDetailsService"
        class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
         <property name="dataSource" ref="dataSource"></property>
</bean>

我们继续观察JdbcDaoSupport类,还是刚才那幅图
至于两种实现方案的优缺点,暂时没有研究,也许因为效率问题。
所以完整的配置如下:
使用jdbcTemplate属性注入dataSource
直接注入dataSource
配置完成后,即可运行项目,这样,获取的用户基本信息以及权限信息都来自数据库。

自定义方式数据结构

刚才JdbcDaoImpl使用默认配置方式,这样话,用户就必须按照默认的配置方式新建相应的表以及字段。但是一般情况下,自己的系统都有自己的表结构或表名称。比如用户基本信息表名称就是test_user而不是users咋办呢?
其实JdbcDaoImpl早已替我们想好了,他对外提供了两个属性,
private String authoritiesByUsernameQuery;
private String usersByUsernameQuery;
默认情况下,通过构造方法赋值默认查询语句。但是既然对外提供set方法,那么用户可以自定义其语句了。
配置方式如下:
   <bean id="userDetailsService"
class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
<property name="jdbcTemplate" ref="JdbcTemplate"> </property>
<!-- 配置查询条件 -->
<property name="usersByUsernameQuery"> 
<value>
 select t.user_name,t.pwd,t.enabled from test_user t where t.user_name=?
</value>
</property>
<property name="authoritiesByUsernameQuery">
   <value>
    select t.user_name,t.auths from test_auths t where t.user_name=?
   </value>
</property>
</bean>
<bean id="JdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  <property name="dataSource" ref="dataSource"></property>
</bean>

我自定义的用户信息test_user表,用户权限表test_auths.只要提供相应的字段即可,至于字段名称是否相同这个不是关键。

项目下载:

项目源码中是JdbcDaoImpl默认的配置方式,若想自定义可以根据博客进行相应配置。

PS:

项目中的spring配置数据源方式,可以参考以前博客《spring配置数据源四种方式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值