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


    在企业应用中,用户的用户名、密码和角色等信息一般存放在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)+" "+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)+"	"+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>
    

          在源代码中,我提供了相应脚本,存放在Acegi5WebRoot dbms目录下。
    启动hsqldb数据库只须在rdbms目录下运行server.bat文件,内容为:
          "%JAVA_HOME%/bin/java" -classpath ..WEB-INFlibhsqldb.jar org.hsqldb.Server -database acegidb
          进入hsqldb客户端管理工具请运行manager.bat文件,内容为:
          "%JAVA_HOME%/bin/java" -classpath ..WEB-INFlibhsqldb.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)

  • 相关阅读:
    EF支持的注解
    c#数组去重复超级简单
    终于开通博客了。
    理解C#中参数
    一般处理程序中session问题
    小菜的面试所感
    为IOS生成opencv framework时遇到的2个问题
    纯真IP地址数据库qqwry.dat解析
    scala纯函数式编程-排序算法实现
    跳跃列表原理和实现
  • 原文地址:https://www.cnblogs.com/wzh123/p/3393000.html
Copyright © 2020-2023  润新知