中间件学习-CAS实现单点登录
Demo搭建
https://github.com/apereo/cas-overlay-template/tree/5.3
首先从网址获取demo模板,5.3之后的都是gradle项目,所以这里下载5.3版本
通过cmd命令执行 build.cmd run命令会生成target目标文件夹
在根目录新建src/main/resources目录
将target\cas\WEB-INF\classes 下生成的services文件夹和application.properties配置文件复制到src/src/main/resources目录
-
修改services下HTTPSandIMAPS-10000001.json文件;将第三行改为 “serviceId” : "^(https|http|imaps)
-
修改application.properties;
#server.ssl.key-store=file:etc/cas/thekeystore
#server.ssl.key-store-password=changeit
#server.ssl.key-password=changeit
将三行全部注释
- 再将application.properties最后一行注释
#cas.authn.accept.users=casuser::Mellon
- application.properties添加如下
cas.tgc.secure=false
cas.serviceRegistry.initFromJson=true
cas.serviceRegistry.json.location=classpath:/services
#查询账号密码sql,必须包含密码字段
cas.authn.jdbc.query[0].sql=select * from sys_user where username=?
#指定上面的sql查询字段名(必须)
cas.authn.jdbc.query[0].fieldPassword=password
#指定过期字段,1为过期,若过期需要修改密码
cas.authn.jdbc.query[0].fieldExpired=expired
#为不可用字段段,1为不可用,
cas.authn.jdbc.query[0].fieldDisabled=disabled
#数据库方言hibernate的知识
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect
#新mysql数据库驱动
cas.authn.jdbc.query[0].driverClass=com.mysql.cj.jdbc.Driver
#数据库驱动
#cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver
#数据库连接
cas.authn.jdbc.query[0].url=jdbc:mysql://localhost:3306/cas?useSSL=false&useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true
#数据库用户名
cas.authn.jdbc.query[0].user=admin//你的数据库user
#数据库密码
cas.authn.jdbc.query[0].password=admin//你的数据库密码
#默认加密策略,通过encodingAlgorithm来指定算法,默认NONE不加密
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
这样配置是不用生成证书以及配置https;而http就可以访问;通过数据库读取用户名及密码
数据库mysql
数据库名cas
我的mysql数据库是驱动是com.mysql.cj.jdbc.Driver;低版本的需要注意
DDL如下
CREATE TABLE `sys_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`expired` int(11) DEFAULT NULL,
`disabled` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
INSERT INTO `sys_user` VALUES ('1', 'admin', '21232f297a57a5a743894a0e4a801fc3', '0', '1');
INSERT INTO `sys_user` VALUES ('2', 'user', 'ee11cbb19052e40b07aac0ca060c23ee', '1', '0');
INSERT INTO `sys_user` VALUES ('3', 'root', '63a9f0ea7bb98050796b649e85481845', '0', '0');
服务器使用
完成以上配置后就可以启动服务端;cmd执行 build.cmd run即可
启动时间较长,当看到ready 的 slogan就可以访问localhost:8443/cas/进入登录界面
分别尝试三个账户登录,root、user、admin账户密码相同,看到不同情况
root账户能够正常登录,那么服务端就成功了
Client客户端
从start.spring.io新建一个工程
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>net.unicon.cas</groupId>
<artifactId>cas-client-autoconfig-support</artifactId>
<version>2.3.0-GA</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
application.properties文件
server.port=8085
#cas服务端的地址
cas.server-url-prefix=http://localhost:8443/cas
#cas服务端的登录地址
cas.server-login-url=http://localhost:8443/cas/login
#客户端访问地址
cas.client-host-url=http://localhost:8085
cas.validation-type=CAS3
新建一个controller
@RestController
public class CasController {
@RequestMapping("/hello")
public String hello() {
return "hello CAS";
}
}
在@SpringBootApplication注解下添加@EnableCasClient注解
运行程序访问localhost:8085/hello
会跳转到localhost:8443进行登录
输入用户名密码后登录成功自动跳转到
再次访问,就不会跳转了,可以直接访问
说明:当关闭浏览器后登录信息才会失效,
简介
单点登录英文全称是:Single Sign On,简称SSO
含义:在多个相互信任的系统中,只要登录一个系统其他系统均可访问。
CAS 是一种使用广泛的单点登录实现,分为客户端CAS Client和服务端 CAS Service,客户端就是我们的系统,服务端是认证中心,由CAS提供,我们需要稍作修改,启动起来就可以用
下图是网上流传的经典示意图
文章参考
https://www.jb51.net/article/189201.htm
https://zhuanlan.zhihu.com/p/25007591
http://www.micmiu.com/enterprise-app/sso/sso-cas-sample/