CAS SSO系列教程:(四)CAS SSO整合Mysql数据库进行用户验证

本系列教程为gevin.me原创文章,转载请注明: CAS SSO系列教程:(四)CAS SSO整合Mysql数据库进行用户验证 | Gevin’s Blog

CAS默认提供的验证方式只是一种简单测试而已,只需要用户名和密码相同即可登录cas服务器,在现实中,该验证方法肯定是要自己实现了,本文将介绍如何与Mysql数据库整合,通过数据库进行用户验证。

结构如下:

修改deployerConfigContext.xml文件,将原来的简单验证改成自己扩展的验证类,如下:

<!--
<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
 -->

<bean class="me.gevin.handler.UserAuthenticationHandler">
	<property name="userInfoService" ref="userInfoService"></property>
</bean>

在spring-configuration文件夹下新建applicationContext-dao.xml和applicationContext-service.xml,内容分别如下:

applicationContext-dao.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
	<description>dataSource</description>

	<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName">
			<value>com.mysql.jdbc.Driver</value>
		</property>
		<property name="url">
			<value>jdbc:mysql://localhost:3306/cas</value>
		</property>
		<property name="username">
			<value>root</value>
		</property>
		<property name="password">
			<value>123456</value>
		</property>
	</bean>

	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>

	<bean id="userInfoDao" class="me.gevin.dao.UserInfoDao">
		<property name="jdbcTemplate" ref="jdbcTemplate"></property>
	</bean>

</beans>

applicationContext-service.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

	<bean id="userInfoService" class="me.gevin.service.UserInfoService">
		<property name="userInfoDao" ref="userInfoDao"></property>
	</bean>

</beans>

修改Model类UserInfo.java

package me.gevin.model;

import java.util.Date;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity(name="userinfo")
public class UserInfo {

	@Id
	@GeneratedValue(strategy=GenerationType.AUTO)
	private int id;
	private String username;
	private String password;
	private Date addDate;
	private String addIp;
	// 省略getter and setter方法
}

新建数据库操作类UserInfoDao.java,内容如下:

package me.gevin.dao;

import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.support.JdbcDaoSupport;

/**
 *
 * @author gevin<gevinhjy@gmail.com>(http://gevin.me/)
 *
 */
public class UserInfoDao extends JdbcDaoSupport {

	/**
	 * 根据用户名获取用户信息
	 *
	 * @param username
	 * @return
	 */
	public List<Map<String, Object>> getUserInfoList(String username) {
		String sql = "Select password from UserInfo where username = ?";
		return this.getJdbcTemplate().queryForList(sql, new Object[]{username});
	}

}

新建业务处理类UserInfoService.java,内容如下:

package me.gevin.service;

import java.util.List;
import java.util.Map;

import me.gevin.dao.UserInfoDao;

/**
 *
 * @author gevin<gevinhjy@gmail.com>(http://gevin.me/)
 *
 */
public class UserInfoService {

	private UserInfoDao userInfoDao;

	/**
	 * 验证用户
	 *
	 * @param username
	 * @param password
	 * @return
	 */
	public boolean checkUser(String username, String password) {
		if (username==null || username.equals("") || password==null || password.equals(""))
			return false;

		List<Map<String, Object>> results = this.userInfoDao.getUserInfoList(username);

		if (results == null || results.size() == 0)
			return false;

		Map<String, Object> map = results.get(0);

		String passwordDb = (String)map.get("password");
		if (passwordDb.equals(""))
			return false;

		if (password.equals(passwordDb))
			return true;

		return false;

	}

	public UserInfoDao getUserInfoDao() {
		return userInfoDao;
	}

	public void setUserInfoDao(UserInfoDao userInfoDao) {
		this.userInfoDao = userInfoDao;
	}

}

新建验证类UserAuthenticationHandler,扩展AbstractUsernamePasswordAuthenticationHandler类,内容如下:

package me.gevin.handler;

import me.gevin.service.UserInfoService;

import org.jasig.cas.authentication.handler.AuthenticationException;
import org.jasig.cas.authentication.handler.BadUsernameOrPasswordAuthenticationException;
import org.jasig.cas.authentication.handler.support.AbstractUsernamePasswordAuthenticationHandler;
import org.jasig.cas.authentication.principal.UsernamePasswordCredentials;

/**
 *
 * @author gevin<gevinhjy@gmail.com>(http://gevin.me/)
 *
 */
public class UserAuthenticationHandler extends AbstractUsernamePasswordAuthenticationHandler {

	private UserInfoService userInfoService;

	@Override
	protected boolean authenticateUsernamePasswordInternal(UsernamePasswordCredentials credentials) throws AuthenticationException {

		String username = credentials.getUsername();
		String password = credentials.getPassword();

		if (!this.userInfoService.checkUser(username, password))
			throw new BadUsernameOrPasswordAuthenticationException("error.authentication.credentials.bad");

		return true;
	}

	public UserInfoService getUserInfoService() {
		return userInfoService;
	}

	public void setUserInfoService(UserInfoService userInfoService) {
		this.userInfoService = userInfoService;
	}

}

至此,已完成与Mysql数据库的整合,登录时系统会验证mysql数据库中是否存在相应的用户名和密码。

本文固定链接: http://gevin.me/544.html | Gevin's Blog

该日志由 admin 于2012年04月23日发表在 Java 分类下, 通告目前不可用,你可以至底部留下评论。
原创文章转载请注明: CAS SSO系列教程:(四)CAS SSO整合Mysql数据库进行用户验证 | Gevin's Blog
关键字: , , , ,

CAS SSO系列教程:(四)CAS SSO整合Mysql数据库进行用户验证:目前有5 条留言

  1. 地板
    chinaren:

    Server端我看网上都是直接在官方的DEMO上改的,你这个我能看明白,但我有几点不明白:
    1、我不想在官方的DEMO Server基础上改动。他里面的classes和XML配置太多了,都不知道哪些是我需要的哪些不是我需要的,我需要把SSO登陆服务端这块集成到我的项目中去,应该如何做。需要加哪些文件进去

    2、最不明白的就是两个客户端WEB。XML的配置,各个配置代表什么意思并且为什么我的两个客户端配置好后,单一的受保护资源需要先登陆后才能访问,但应该说我clientA登陆后clientB就不需要再登陆了呀。可clientB的受保护资源却需要再登陆一次才行,这里最不明白。

    3、并且xercesImpl.jar xml-apis.jar 这两个JAR包我在CAS中也没有找到,是需要自己下载吗?

    希望能得到作者的回复

    2012-04-24 15:22 [回复]
  2. 板凳
    admin:

    问题1:这个对我目前来说,我无法解决你的问题,因为我还没去研究CAS的源码,所以没办法自己实现,只能在上面的基础上修改,不过我看网上大部分人都是在此项目上进行修改的。不然就不叫基于CAS的SSO了。

    问题2:对于这个web.xml,其实我也是按照官方提供的来配置的,具体每一项的说明,你可以google一下,应该都有具体的解释的。同时,clientA和clientB都必须配置web.xml,才能让实现单点登录

    问题3:需要下载xerces工具包,下载网址http://xerces.apache.org/#xerces2-j
    里面有
    xercesImpl.jar
    xml-apis.jar

    2012-04-24 17:18 [回复]
    • chinaren:

      你能远程帮我看一下吗?能否加你的QQ,第二个问题我无法解决,

      2012-04-24 21:54 [回复]
      • chinaren:

        郁闷呀。。clientA和clientB都必须配置web.xml,才能让实现单点登录。我都配了的。但还是两个系统都分别需要登陆。。你帮我远程看一下吧

        2012-04-24 22:00 [回复]
  3. 沙发
    admin:

    两个都配了,按道理应该都可以呀。如果还没解决的话,我加你QQ吧,看看我能不能解决。

    2012-04-25 08:15 [回复]

发表评论

快捷键:Ctrl+Enter