acegi security实践教程—把用户信息存放到数据库
2014-03-13 09:04
323 查看
概括:
前几篇博客中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 >
分析:
[align=left] 根据源码,我们分析到userDetailService的实现类有两个:InMemoryDaoImpl和JdbcDaoImpl,那这篇博客就尝试用JdbcDaoImpl类。[/align]具体开发步骤:
开发环境: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 = ?";
[align=left] 所以,您的数据库中必须有这两个表以及相应的字段。[/align]
2.JdbcDaoImpl继承了spring的JdbcDaoSupport类,其中spring的JdbcDaoSuupport类如下:
分析注入dataSource数据源:
[align=left] 通过springJdbcDaoSupport类,是需要注入一个数据源对象。具体了解一下,从源码哪里可以看出需要注入数据源呢,spring的注入配置,主要观察类代码。[/align]
[align=left] [/align]
[align=left] 根据上图的分析,可以配置,通过jdbcTemplate属性注入dataSource对象。如下配置:[/align]
<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>
[align=left] 其实根据源码的分析,也可以这么配置,不用jdbcTemplate属性,而是直接注入dataSource对象。[/align]
<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配置数据源四种方式》相关文章推荐
- acegi security实践教程—资源角色信息存到放数据库
- 获取数据库中的所有用户表、取数据表的描述信息包括描述说明
- 使用数据库统一管理ssh登陆用户密钥信息
- 微信公众平台开发教程第5篇-----网页授权获取用户基本信息
- java高并发写入用户信息到数据库的几种方法
- Python爬虫小实践:寻找失踪人口,爬取失踪儿童信息并写成csv文件,方便存入数据库
- Oracle提取现有数据库表空间、角色、用户信息,并生成脚本
- 【Spring Security】三、自定义数据库实现对用户信息和权限信息的管理
- Discuz! X2中存放用户信息的表
- mysql+jsp,在jsp页面连接了数据库,已成功获取数据库字段,请问如何取到当前用户对应的信息
- acegi security实践教程—定制userDetailsService
- Apache James研发中的用户信息数据库存储和密码问题
- 数据库中信息存放到 实体类中
- 查看数据库所有用户表及其列信息
- 通过Cookie存放用户登录信息以及安全性问题
- 查询所有SQL用户的连接信息(可显示IP)\SQL Server中强制关闭数据库连接
- [004]微信公众账号开发教程第1篇-根据用户openID获取用户基本信息
- 微信网页开发授权(获取用户信息) 微信公众平台开发教程(4)
- 得到当前数据库中所有用户表信息
- acegi security实践教程—访问系统中资源前必须登陆系统