wzh123

博客园 首页 新随笔 联系 订阅 管理

在企业应用中,用户的用户名、密码和角色等信息一般存放在RDBMS(关系数据库)中。前面几节我们采用的是InMemoryDaoImpl,即基于内存的存放方式。这节我们将采用RDBMS存储用户信息。

 

 

       UserDetailsService的接口实现有JdbcDaoImpl和InMemoryDaoImpl。JdbcDaoImpl通过数据库获取用户名、密码和角色信息,它将是接下来的重点内容。

      

1、简单JdbcDaoImpl配置

       默认时, JdbcDaoImpl会采用如下SQL获得用户名、密码、启用状态:

SELECT username, password, enabled From users WHERE username=?

类似地, JdbcDaoImpl会采用如下SQL获得用户的授权信息(角色集合):

SELECT username, authority FROM authorities WHERE username=?

 

所以, 只要数据库中有这两个表和相应字段, 那么只需这样配置:

 

Xml代码  
  1. <SPAN style="FONT-SIZE: small"><bean id="daoAuthenticationProvider"  
  2.     class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">  
  3.     <property name="userDetailsService" ref="jdbcDaoImpl" />  
  4.     ...   
  5. </bean>  
  6. <bean id="jdbcDaoImpl"  
  7.     class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">  
  8.     <property name="dataSource">  
  9.         <ref bean="dataSource" />  
  10.     </property>  
  11. </bean>  
  12. </SPAN>  
<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>

 

 

       在这里,我们只需提供dataSource(数据源)的配置信息,并将dataSource注入到JdbcDaoImpl中。

 

2Hsqldb使用配置

       Hsqldb 是一个优秀的轻量级开源的纯Java SQL 数据库,大家可以从Hsqldb 官方网站(http://hsqldb.org)获取到Hsqldb 的发布包、源代码和文档。

 

       转自他人的简单使用教程:

初用 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

 

到目录 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 文件

 

Java代码  
  1. package hsqldb;   
  2.   
  3. import java.sql.Connection;   
  4. import java.sql.DriverManager;   
  5. import java.sql.ResultSet;   
  6. import java.sql.SQLException;   
  7. import java.sql.Statement;   
  8.   
  9. /**  
  10. *   
  11. * @author chenlb 2007-4-28  
  12. *  
  13. */  
  14. public class HsqldbFirstSimple {   
  15.   
  16.     /**  
  17.       * @param args  
  18.      */  
  19.     public static void main(String[] args) {   
  20.         // TODO Auto-generated method stub   
  21.   
  22.         try {   
  23.              Class.forName("org.hsqldb.jdbcDriver" );   
  24.          } catch (Exception e) {   
  25.              System.out.println("ERROR: failed to load HSQLDB JDBC driver.");   
  26.              e.printStackTrace();   
  27.             return;   
  28.          }   
  29.   
  30.         try {   
  31.              Connection c = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/xdb", "sa", "");   
  32.              Statement stmt = c.createStatement();   
  33.              ResultSet rs = stmt.executeQuery("select * from text");   
  34.             while(rs.next()) {   
  35.                  System.out.println(rs.getString(1)+"\t"+rs.getString(2));   
  36.              }   
  37.          } catch (SQLException e) {   
  38.             // TODO Auto-generated catch block   
  39.              e.printStackTrace();   
  40.          }   
  41.      }   
  42.   
  43. }  
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')

 

数据源配置:

 

Xml代码  
  1. <beans>  
  2.     <bean id="dataSource"  
  3.         class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  4.         <property name="driverClassName">  
  5.             <value>org.hsqldb.jdbcDriver</value>  
  6.         </property>  
  7.         <property name="url">  
  8.             <value>jdbc:hsqldb:hsql://localhost/</value>  
  9.         </property>  
  10.         <property name="username">  
  11.             <value>sa</value>  
  12.         </property>  
  13.         <property name="password">  
  14.             <value></value>  
  15.         </property>  
  16.     </bean>  
  17. </beans>  
<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配置如:

Xml代码  
  1. <bean id="jdbcDaoImpl"  
  2.     class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">  
  3.     <property name="dataSource">  
  4.         <ref bean="dataSource" />  
  5.     </property>  
  6.   
  7.     <property name="usersByUsernameQuery">  
  8.         <value>  
  9.             SELECT username, password, enabled From users WHERE   
  10.             username=?   
  11.         </value>  
  12.     </property>  
  13.     <property name="authoritiesByUsernameQuery">  
  14.         <value>  
  15.             SELECT username, authority FROM authorities WHERE username=?   
  16.         </value>  
  17.     </property>  
  18. </bean>  
<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 WHERE
			username=?
		</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)

 

 

 

 

 

 

 

posted on 2013-10-28 19:56  wzh123  阅读(205)  评论(0编辑  收藏  举报