CAS单点登录系列(4)-使用RDBMS认证

在实际应用中,用户认证信息一般会存放在RDBMS或LDAP中,这样能够更好的保证系统的安全性。本节将采用RDBMS的存储方式,通过一个简单的实例展示其使用方法。

1. 准备环境

操作系统:32位Window XP

CAS服务器:Cas Server 3.3.3

CAS客户端:Cas Client 3.1.10

Web服务器:Tomcat 6.0.18

数据库:MySQL 5.0

 

2. 准备数据库

2.1. 创建数据库

create database cas CHARSET=utf8;

2.2. 创建用户表

CREATE TABLE `users` (

`id` int(11) NOT NULL auto_increment,

`username` varchar(50) NOT NULL,

`password` varchar(50) NOT NULL,

`sex` varchar(2) NOT NULL,

`age` int(4) NOT NULL,

PRIMARY KEY  (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2.3. 准备数据

INSERT INTO `users` VALUES (‘1’, ‘admin’, ‘21232f297a57a5a743894a0e4a801fc3’, ‘男’, ’26’);

INSERT INTO `users` VALUES (‘2’, ‘javaee’, ‘21232f297a57a5a743894a0e4a801fc3’, ‘男’, ’26’);

密码均为admin。

 

3. 添加数据库信息

打开cas3的WEB-INF/ cas.properties文件,添加数据库相关信息:

jdbc.driver=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/cas?useUnicode=true&characterEncoding=utf-8&autoReconnect=true

jdbc.username=root

jdbc.password=root

cas.auth.sql=select u.password from users u where lower(u.username) = lower(?)

其中,url、username、password根据实际情况进行修改。

4. 添加Jar包

MySQL数据库JDBC支持包:mysql-connector-java-5.1.9.jar

DBCP连接池支持包:commons-pool-1.2.jar、commons-dbcp- 1.2.1.jar

QueryDatabaseAuthenticationHandler使用Spring JDBC支持包:spring-jdbc-2.5.6.jar

JDBC认证处理器实现支持:cas-server-support-jdbc-3.3.3.jar

 

5. 配置数据库认证

5.1. 认证管理器

在讲解如何使用数据库认证之前,让我们先来了解一下AuthenticationManagerImpl对象authenticationManager。authenticationManager对象用于认证用户信息,在用户登录CAS时,将会使用该认证管理器进行认证。

AuthenticationManagerImpl实现了AuthenticationManager接口,接口定义如下:

public interface AuthenticationManager {

String AUTHENTICATION_METHOD_ATTRIBUTE = “authenticationMethod”;

Authentication authenticate(final Credentials credentials)

throws AuthenticationException;

}

 

AuthenticationManagerImpl借助于AuthenticationHandler集合List<AuthenticationHandler>和CredentialsToPrincipalResolver集合List<CredentialsToPrincipalResolver>完成对用户的认证工作。AuthenticationHandler负责完成用户的认证工作,而CredentialsToPrincipalResolver负责构建认证结果。

对于配置了多个AuthenticationHandler的实现,一旦其中一个认证处理器认证通过,其他认证处理器将不再执行。配置了多个CredentialsToPrincipalResolver的处理方式与AuthenticationHandler一致。

 

至此,我们认识到如果要实现RDBMS认证,必须提供相应的AuthenticationHandler实现方式。那么具体需要如何来实现,CAS为我们提供了基本的JDBC支持包cas-server-support-jdbc-3.3.3.jar。在CAS中引入该包后,使用其实现类org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler将满足我们的需要。接下来,我们开始进行配置:

 

5.2. 修改配置文件deployerConfigContext.xml

打开cas3的WEB-INF/deployerConfigContext.xml文件

5.2.1. 添加dbcp数据源配置

<bean id=”dataSource” class=”org.apache.commons.dbcp.BasicDataSource” destroy-method=”close”>

<property name=”driverClassName” value=”{jdbc.driver}” />

<property name=”url” value=”{jdbc.url}” />

<property name=”username” value=”{jdbc.username}” />

<property name=”password” value=”{jdbc.password}” />

</bean>

 

5.2.2. 添加MD5加密编码器

<bean id=”passwordEncoder” class=”org.jasig.cas.authentication.handler.DefaultPasswordEncoder”>

<constructor-arg value=”MD5″ />

</bean>

 

5.2.3. 添加RDBMS认证处理器

替换authenticationHandlers中的SimpleTestUsernamePasswordAuthenticationHandler认证处理器,代码如下:

<bean class=”org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler”>

<property name=”dataSource” ref=”dataSource” />

<property name=”sql” value=”${cas.auth.sql}” />

<property name=”passwordEncoder” ref=”passwordEncoder” />

</bean>

5.2.4. 验证配置

经过以上几个步骤,对于数据库认证的配置已经完成。接下来,我们启动Tomcat进行测试。启动完毕后,使用admin或javaee用户登录CAS认证服务器,如果登录成功,我们将会在Tomcat日志中看到类似信息:

从日志信息中可以看到,我们的确成功的借助于QueryDatabaseAuthenticationHandler对用户进行了认证。

 


---转载本站文章请注明作者和出处 996极客教程(996geek.com),请勿用于任何商业用途---

留下评论