「个人学习记录,肯定有理解错误和理解不透的地方,小白总是有个成长的过程,希望大家多多指教。」
书接上文:单点登录CAS解决方案<一>:纯净CAS-Server ,本文主要讲解的是将原来的默认验证方式修改为MySql数据表验证,这也是很常用的需求,不多废话。下面先推荐几个链接:
CAS-Server官方文档:http://jasig.github.io/cas/4.0.x/index.html
CAS各版本源码(包含了其他一些服务开源的项目):https://github.com/Jasig
一、依赖包
1、依赖包下载:
cas-server-support-jdbc-4.0.3.jar,druid-1.0.15.jar,mysql-connector-java-5.1.36.jar。这些包的下载,我想从上文的教程中应该得到了经验,那就是直接在Maven库中下载,再给最后一个例子,以后就直接说依赖包,自行去Maven库中下载。
直接将上面的下载的三个.jar包放到“WebContent/WEB-INF/lib”目录下。
二、配置
1、连接池配置
知道alibaba的温少的,看到上面的druid-1.0.15.jar包就应该感觉到很亲切,这是一个很强大的JDBC数据库连接池,使用相当简单方便。直接上干货。
- web.xml文件配置,直接在web.xml文件下添加下面内容
<!-- Druid连接池 -->
<filter>
<filter-name>DruidWebStatFilter</filter-name>
<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
<init-param>
<param-name>exclusions</param-name>
<param-value>*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>DruidWebStatFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>DruidStatView</servlet-name>
<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DruidStatView</servlet-name>
<url-pattern>/druid/*</url-pattern>
</servlet-mapping>
- deplayerConfigContext.xml,在该文件中添加如下内容
<!-- Define the DB Connection -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<!-- 数据库基本信息配置 -->
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<!-- 数据库ip,端口,数据库名…… -->
<property name="url" value="jdbc:mysql://127.0.0.1:3306/sso?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull" />
<!-- 数据库用户名 -->
<property name="username" value="root" />
<!-- 数据库密码 -->
<property name="password" value="123456" />
<!-- 初始化连接数量 -->
<property name="initialSize" value="5" />
<!-- 最大并发连接数 -->
<property name="maxActive" value="10" />
<!-- 最小空闲连接数 -->
<property name="minIdle" value="3" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="20000" />
<!-- 超过时间限制是否回收 -->
<property name="removeAbandoned" value="true" />
<!-- 超过时间限制多长; -->
<property name="removeAbandonedTimeout" value="180" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<!-- 用来检测连接是否有效的sql,要求是一个查询语句-->
<property name="validationQuery" value="SELECT 1 FROM mysql" />
<!-- 申请连接的时候检测 -->
<property name="testWhileIdle" value="true" />
<!-- 申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能 -->
<property name="testOnBorrow" value="false" />
<!-- 归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能 -->
<property name="testOnReturn" value="false" />
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<property name="poolPreparedStatements" value="true" />
<property name="maxPoolPreparedStatementPerConnectionSize" value="50" />
<!--属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:
监控统计用的filter:stat
日志用的filter:log4j
防御SQL注入的filter:wall -->
<property name="filters" value="stat" />
</bean>
- deplayerConfigContext.xml,删除该文件下的:
<bean id="primaryAuthenticationHandler"
class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">
<property name="users">
<map>
<entry key="casuser" value="Mellon"/>
</map>
</property>
</bean>
- deplayerConfigContext.xml,在该文件下添加:
<!-- 密码加密规则,这个规则可自定义,以后会在博客中记录 -->
<bean id="passwordEncoder"
class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"
c:encodingAlgorithm="MD5"
p:characterEncoding="UTF-8" />
<!-- 用户验证Handler -->
<bean id="dbAuthHandler"
<!-- CAS与数据库之间的适配器,这个地方可以自定义,以后会在博客中记录 -->
class="org.jasig.cas.adaptors.jdbc.SearchModeSearchDatabaseAuthenticationHandler"
<!-- 上文中的数据库连接池对象 -->
p:dataSource-ref="dataSource"
<!-- 密码加密规则对象 -->
p:passwordEncoder-ref="passwordEncoder"
<!-- 数据库中的用户表 -->
p:tableUsers="sso_users
<!-- 用户表中的用户名字段 -->
p:fieldUser="username"
<!-- 用户表中的密码字段 -->
p:fieldPassword="password" />
- deplayerConfigContext.xml,修改该文件的下面内容:
<constructor-arg>
<map>
<!--
| IMPORTANT
| Every handler requires a unique name.
| If more than one instance of the same handler class is configured, you must explicitly
| set its name to something other than its default name (typically the simple class name).
-->
<entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
<entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />
</map>
</constructor-arg>
更改为:(其实就是把primaryAuthenticationHandler修改为上面自定义的dbAuthHandler)
<constructor-arg>
<map>
<!--
| IMPORTANT
| Every handler requires a unique name.
| If more than one instance of the same handler class is configured, you must explicitly
| set its name to something other than its default name (typically the simple class name).
-->
<entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
<entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver" />
</map>
</constructor-arg>
三、创建数据库
这里,mysql安装就不用说了吧,创建下面的表,注意这个“表名”和上面数据库连接池设置的要一样啊。再就是表中的username,和password字段也要和上面的配置一样。
CREATE TABLE `sso` (
`id` int(13) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL,
`password` varchar(32) NOT NULL,
`nick` varchar(20) DEFAULT NULL,
`sex` tinyint(1) NOT NULL DEFAULT '1',
`email` varchar(50) DEFAULT NULL,
`phone` varchar(20) DEFAULT NULL,
`createtime` int(13) DEFAULT NULL,
`modifytime` int(13) DEFAULT NULL,
PRIMARY KEY (`id`,`username`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
insert into `sso_users`(`id`,`username`,`password`,`nick`,`sex`,`email`,`phone`,`createtime`,`modifytime`) values (1,'liucao','a8a2a67a027289ba5dda5b651980b995','Mr.Liucao',1,'694065513@qq.com','15080071987',2147483647,2147483647);
四、运行
打开页面后直接输入用户名:liucao 密码:liucao
是否如愿以偿呢?