CAS从数据库获取用户信息
1.1特别说明
由于考虑到后面的博文,所以在这里我们直接将工程弄到eclipse下去进行定制修改可能会更方便一些。我这是在项目中直接使用,可能基本上说的都是一些实战过程,
对原理方面介绍的少,毕竟大家大多数人想要的是拿着就上手的,不好之处还请大家谅解,多多指正一起交流。
1.2 准备工作
(1)创建maven工程转成WEB项目(我的项目名:cas-sample)
(2)解压cas-server-webapp-4.0.0.war
(3)将解压后的文件全部拷贝到:src->main->webapp下,将classes拷贝到src/main/resource下
(4)或者直接导入工程:cas-server-webapp,导入方式选择Maven即可
1.3开始CAS之旅
第一部分:
在WEB-INF找到deployerConfigContext.xml,该文件是CAS发布部署配置文件,打开deployerConfigContext.xml,很多人可能在上一篇博文中有所疑惑,登录的时候
用户名与密码在哪呢?就在deployerConfigContext.xml文件里面,往下看你就明白啦。
(1)注释以下代码
<bean id="primaryAuthenticationHandler"
class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">
<property name="users">
<map>
<entry key="casuser" value="Mellon"/>
</map>
</property>
</bean>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<property name="url" value="${a_jdbc.url}" />
<property name="username" value="${a_jdbc.username}" />
<property name="password" value="${a_jdbc.password}" />
<property name="driverClassName" value="${a_jdbc.driver}" />
<!-- 配置初始化大小、最小、最大 -->
<property name="initialSize" value="${a_jdbc.pool.minIdle}" />
<property name="minIdle" value="${a_jdbc.pool.minIdle}" />
<property name="maxActive" value="${a_jdbc.pool.maxActive}" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="${a_jdbc.pool.maxWait}" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="${a_timeBetweenEvictionRunsMillis}" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="${a_minEvictableIdleTimeMillis}" />
<property name="validationQuery" value="SELECT 'x' FROM DUAL" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<!-- 打开PSCache,并且指定每个连接上PSCache的大小(Oracle使用) -->
<!-- <property name="poolPreparedStatements" value="true" /> <property
name="maxPoolPreparedStatementPerConnectionSize" value="20" /> -->
<!-- removeAbandoned功能自动检测连接打开超过指定时间未被使用自动关闭 时间单位为秒,logAbandoned设置关闭是否输出日志 -->
<!-- <property name="removeAbandoned" value="false" /> <property name="removeAbandonedTimeout"
value="1800" /> <property name="logAbandoned" value="true" /> -->
<!-- 配置监控统计拦截的filters -->
<property name="filters" value="stat" />
</bean>
<bean id="customAuthHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"
p:dataSource-ref="dataSource"
p:sql="select password from user where loginname=?" />
(3)修改以下配置,将圈红处修改为:customAuthHandler
(4)在cas.properties增加以下配置
a_jdbc.driver=com.mysql.jdbc.Driver
a_jdbc.url=jdbc:mysql://localhost:3306/cassso?useUnicode=true&characterEncoding=utf8
a_jdbc.username=root
a_jdbc.password=root
a_jdbc.pool.minIdle=10
a_jdbc.pool.maxActive=50
a_jdbc.pool.maxWait=60000
a_timeBetweenEvictionRunsMillis=60000
a_minEvictableIdleTimeMillis=300000
(5)在WEB-INF lib中加入mysql驱动包,以及cas-server-support-jdbc-4.0.0.jar
(6)在pom.xml中加入以下依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.14</version>
</dependency>
第二部分:
通过上第一部分内容,我们已经完成了对数据库中的用户进行登录。但是实际项目中,不可能这么简单的,接下来我们就自定义认证处理器,
这就是为什么一开始我就把CAS弄到eclipse中了吧。好了言归正传。让我们先了解下第一部分使用的类层次结构。
点击:org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler ,直接使用快捷键F4,如果快捷键不好用的话,在eclipse工具栏上点击:
Navigate->Open type Hierarchy,我们能看到最顶层的接口是:AuthenticationHandler,CAS提供了一些子类,
例如:AbstractUsernamePasswordAuthenticationHandler,AbstractJdbcUsernamePasswordAuthenticationHandler ,在定义认证处理器的时候,
根据不同需要选择即可,其余的我就不多说了,毕竟我们要的是快速实战,领导还在后面催着呢,就直接进入主题了,要是个人有兴趣可以一起探讨。
(1)创建包:org.chengli.cas,再创建类:CustomAuthenticationHandler 继承 AbstractUsernamePasswordAuthenticationHandler或
者AbstractJdbcUsernamePasswordAuthenticationHandler都可以。
(2)实现authenticateUsernamePasswordInternal方法。返回值是一个HandlerResult,如果对返回值不是清楚,可以参考:org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler 类中的实现。
具体实现内容我这里就不细写了,相信大家到这里都应该知道怎么处理了。如果有不清楚的,留言一起讨论。目前我的项目结构: