zhanjia 发表于 2013-1-30 02:03:40

菜鸟-手把手教你把Acegi应用到实际项目中(6)


       
在企业应用中,用户的用户名、密码和角色等信息一般存放在RDBMS(关系数据库)中。前面几节我们采用的是InMemoryDaoImpl,即基于内存的存放方式。这节我们将采用RDBMS存储用户信息。<span style="font-family: Arial;" /> 

 
<span style="font-size: small;">       UserDetailsService的接口实现有JdbcDaoImpl和InMemoryDaoImpl。JdbcDaoImpl通过数据库获取用户名、密码和角色信息,它将是接下来的重点内容。
      
<span style="font-size: small;">1、简单JdbcDaoImpl配置
<span style="font-size: small;">       默认时, JdbcDaoImpl会采用如下SQL获得用户名、密码、启用状态:
SELECT username, password, enabled From users WHERE username=?
<span style="font-size: small;">类似地, JdbcDaoImpl会采用如下SQL获得用户的授权信息(角色集合):
SELECT username, authority FROM authorities WHERE username=?
 
所以, 只要数据库中有这两个表和相应字段, 那么只需这样配置:
 
<bean id="daoAuthenticationProvider"class="org.acegisecurity.providers.dao.DaoAuthenticationProvider"><property name="userDetailsService" ref="jdbcDaoImpl" />...</bean><bean id="jdbcDaoImpl"class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl"><property name="dataSource"><ref bean="dataSource" /></property></bean> 

 
<span style="font-size: small;">       在这里,我们只需提供dataSource(数据源)的配置信息,并将dataSource注入到JdbcDaoImpl中。
 
<span style="font-size: small;">2、Hsqldb使用配置
<span style="font-size: small;">       Hsqldb 是一个优秀的轻量级开源的纯Java SQL 数据库,大家可以从Hsqldb 官方网站(http://hsqldb.org)获取到Hsqldb 的发布包、源代码和文档。
 
<span style="font-size: small;">       转自他人的简单使用教程:
初用 hsqldb
今天初了下 hsqldb
 
下载 hsqldb
http://sourceforge.net/project/showfiles.php?group_id=23316
 
下载 hsqldb_1_8_0_7.zip
 
解压到 D:/hsqldb
 
在 D:/hsqldb 目录下创建 runxdb.bat 文件如下:
cd data
java -cp ../lib/hsqldb.jar org.hsqldb.Server -database.0 xdb -dbname.0 xdb
 
然后双击 runxdb.bat 启动 hsqldb Server
 
<span style="font-size: small;">到目录 demo 下运行 runManagerSwing.bat 来创建表
type : HSQL Database Engine Server
url : jdbc:hsqldb:hsql://localhost/xdb
user : SA
 
建表:
CREATE MEMORY TABLE TEXT(ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 1) NOT NULL PRIMARY KEY,NAME VARCHAR);
添加数据:
INSERT INTO TEXT VALUES(1,'chenlb')
INSERT INTO TEXT VALUES(2,'Tenny')
Java 文件


package hsqldb;import java.sql.Connection;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.Statement;/*** * @author chenlb 2007-4-28**/public class HsqldbFirstSimple {    /**      * @param args   */    public static void main(String[] args) {      // TODO Auto-generated method stub      try {             Class.forName("org.hsqldb.jdbcDriver" );         } catch (Exception e) {             System.out.println("ERROR: failed to load HSQLDB JDBC driver.");             e.printStackTrace();            return;         }      try {             Connection c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/xdb", "sa", "");             Statement stmt = c.createStatement();             ResultSet rs = stmt.executeQuery("select * from text");            while(rs.next()) {               System.out.println(rs.getString(1)+"\t"+rs.getString(2));             }         } catch (SQLException e) {            // TODO Auto-generated catch block             e.printStackTrace();         }   }} 
 

 
本节中用到的数据库脚本:
CREATE SCHEMA PUBLIC AUTHORIZATION DBA
CREATE MEMORY TABLE USERS(USERNAME VARCHAR_IGNORECASE(50) NOT NULL PRIMARY KEY,PASSWORD VARCHAR_IGNORECASE(50) NOT NULL,ENABLED BOOLEAN NOT NULL)
CREATE MEMORY TABLE AUTHORITIES(USERNAME VARCHAR_IGNORECASE(50) NOT NULL,AUTHORITY VARCHAR_IGNORECASE(50) NOT NULL,CONSTRAINT FK_AUTHORITIES_USERS FOREIGN KEY(USERNAME) REFERENCES USERS(USERNAME))
CREATE USER SA PASSWORD ""
GRANT DBA TO SA
SET WRITE_DELAY 20
SET SCHEMA PUBLIC
INSERT INTO USERS VALUES('javaee','password',TRUE)
INSERT INTO USERS VALUES('qiuzj','password',FALSE)
INSERT INTO USERS VALUES('sam','password',TRUE)
INSERT INTO AUTHORITIES VALUES('javaee','ROLE_SUPERVISOR')
INSERT INTO AUTHORITIES VALUES('sam','ROLE_USER')
INSERT INTO AUTHORITIES VALUES('qiuzj','ROLE_SUPERVISOR')
 
数据源配置:


<beans><bean id="dataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName"><value>org.hsqldb.jdbcDriver</value></property><property name="url"><value>jdbc:hsqldb:hsql://localhost/</value></property><property name="username"><value>sa</value></property><property name="password"><value></value></property></bean></beans> 
 

 

      在源代码中,我提供了相应脚本,存放在Acegi5\WebRoot\rdbms目录下。
启动hsqldb数据库只须在rdbms目录下运行server.bat文件,内容为:
      "%JAVA_HOME%/bin/java" -classpath ..\WEB-INF\lib\hsqldb.jar org.hsqldb.Server -database acegidb
      进入hsqldb客户端管理工具请运行manager.bat文件,内容为:
      "%JAVA_HOME%/bin/java" -classpath ..\WEB-INF\lib\hsqldb.jar org.hsqldb.util.DatabaseManager
      实际调试我们可以根据实际情况进行修改。


3、自定义SQL语句
      在开发实际企业应用期间,用户信息的获取方式往往是千差万别的,所以可能不存在users、authorities表和相应名字的属性。考虑到这方面的需求,Acegi的JdbcDaoImpl为我们暴露了usersByUsernameQuery和authoritiesByUsernameQuery属性,它们分别用于自定义SQL语句,获取系统用户和授权信息。
      此时jdbcDaoImpl配置如:

<bean id="jdbcDaoImpl"class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl"><property name="dataSource"><ref bean="dataSource" /></property><property name="usersByUsernameQuery"><value>SELECT username, password, enabled From users WHEREusername=?</value></property><property name="authoritiesByUsernameQuery"><value>SELECT username, authority FROM authorities WHERE username=?</value></property></bean>

 
 
4、说明
开发环境:
MyEclipse 5.0GA
Eclipse3.2.1
JDK1.5.0_10
tomcat5.5.23
acegi-security-1.0.7
Spring2.0

Jar包:
acegi-security-1.0.7.jar
Spring.jar(2.0.8)
commons-codec.jar
jstl.jar (1.1)
standard.jar
commons-logging.jar(1.0)
hsqldb.jar(1.8.0.10)
 
 
 
 
 
 
页: [1]
查看完整版本: 菜鸟-手把手教你把Acegi应用到实际项目中(6)