上一章“搭建cas-overlay-5.3工程”说明了如何搭建一个cas服务端工程,细心的读者发现验证的时候登录账号和密码是静态的。实际的场景中,单点登录的服务端一般都是通过数据库进行密码验证的。
数据库中账号和密码至少分两类,一类是管理员,这个账号可以进行单点登录系统的管理和配置等等工作,还有一类账号是使用单点登录系统的成员,这些成员通过权限配置才真正的决定了可以通过单点登录系统登录到哪些客户端系统(多个应用)。
本章将实现通过JDBC的方式进行登录验证。
1、前置准备
首先做如下准备
- 准备一个mysql数据库
- 创建用户表
- 插入如下数据
本例中使用的mysql数据库,本例中在test数据库中创建了user_info
CREATE TABLE `user_info` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) DEFAULT '' COMMENT '用户名',
`password` varchar(255) DEFAULT NULL COMMENT '登录密码',
`name` varchar(255) DEFAULT NULL COMMENT '用户真实姓名',
`id_card_num` varchar(255) DEFAULT NULL COMMENT '用户身份证号',
`state` char(1) DEFAULT '0' COMMENT '用户状态:0:正常状态,1:用户被锁定',
PRIMARY KEY (`uid`),
UNIQUE KEY `username` (`username`) USING BTREE,
UNIQUE KEY `id_card_num` (`id_card_num`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
接着我们插入如下几条数据
#插入用户信息表
INSERT INTO user_info(uid,username,`password`,`name`,id_card_num) VALUES (null,'admin','123456','管理员','111111');
INSERT INTO user_info(uid,username,`password`,`name`,id_card_num) VALUES (null,'zhangsan','123456','张三','222222');
INSERT INTO user_info(uid,username,`password`,`name`,id_card_num) VALUES (null,'lisi','123456','李四','333333');
INSERT INTO user_info(uid,username,`password`,`name`,id_card_num) VALUES (null,'wangwu','123456','王五','444444');
2、修改CAS的jdbc配置
修改pom文件
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jdbc</artifactId>
<version>${cas.version}</version>
</dependency>
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-jdbc-drivers</artifactId>
<version>${cas.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.36</version>
</dependency>
>修改完成后,会进行重新导入
修改配置文件 application.properties
1)注释静态登陆账号
2)添加jdbc相关配置
我的数据库为 test,账号为 root 密码为root123
在配置文件里面,添加如下内容:
#jdbc配置
#添加jdbc认证
cas.authn.jdbc.query[0].sql=SELECT * FROM user_info WHERE username =?
#那一个字段作为密码字段
cas.authn.jdbc.query[0].fieldPassword=password
#配置数据库连接
cas.authn.jdbc.query[0].url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect
#数据库用户名
cas.authn.jdbc.query[0].user=root
#数据库密码
cas.authn.jdbc.query[0].password=root123
#mysql驱动
cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver
3、验证
将工程运行起来,我们可以用数据库中的账号进行登录,如果前面都正确操作了,那么你可以用以下账号进行登录
修改密码采用MD5验证
由于一般情况下,密码是不明文暴露的,因此需要对密码进行加密处理。 一般情况下用MD5的比较多。CAS框架也支持MD5
- 首先在数据库里面插入一条用MD5保存密码的记录
INSERT INTO user_info(uid,username,`password`,`name`,id_card_num) VALUES (null,'admin2','e10adc3949ba59abbe56e057f20f883e','管理员','666666');
这里新的账号是 admin2, 密码 123456 MD5密码: e10adc3949ba59abbe56e057f20f883e
插入后,数据库中情况如下:
- 修改CAS的配置文件
在application.properties文件中jdbc后面添加上加密策略各属性
#配置加密策略
cas.authn.jdbc.query[0].passwordEncoder.type=DEFAULT
cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8
cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5
#配如下图所示:
- 修改完成后,重启工程:
等待登陆页面起来后,做下面2个操作
- 使用admin 账号,密码: 123456 登陆
这个时候,由于使用了MD5作为密码策略,所以用密码123456登陆,登陆失败。原因是CAS会将123456转换成MD5编码,和数据库中的password字段进行比较,不一致则显示登陆失败
- 使用账号admin2 密码:123456 登陆
原因和上面也是一样。