在微服务以及分布式系统中,单点登陆变得愈来愈广泛,松哥以前也有两篇文章和你们介绍过单点登陆的方案:php
这两种方案中,JWT 存在一个注销登陆的问题,要费点功夫解决。@EnableOAuth2Sso 注解这种方案不存在注销登陆的问题,可是又不像 JWT 那么灵活。java
没有银弹!git
在实际项目中,咱们只能根据本身的实际需求,看一看哪种方案更适合本身,而后在此基础上进行改造!github
如今咱们在 Spring Cloud Security 中使用 OAuth2+JWT 或者使用 @EnableOAuth2Sso 注解比之前要方便不少了,松哥也是最近才把项目切换到 Spring Cloud Security 技术栈上面来,在这以前,单点登陆用的更多的是 CAS 单点登陆。相信有很多小伙伴在公司里可能也仍是使用了 CAS 单点登陆这种方案,今天松哥就来花点时间,和你们聊聊 CAS+Spring Security 实现单点登陆,这种方案到底该怎么玩。web
可能会连续几篇文章来介绍 CAS 单点登陆,本文先来讲说理论和登陆流程。另外,因为 CAS 和 Spring Cloud OAuth2 在某些方面具备必定的类似性,因此强烈建议你们先看一看松哥的 OAuth2 系列教程,再来阅读本文就会轻松不少(公众号后台回复 OAuth2 有相关教程)。算法
本文是 Spring Security 系列第 23 篇,阅读本系列前面的文章有助于更好的理解本文:数据库
CAS 全称叫作中央认证服务,英文是 Central Authentication Service。后端
这是由耶鲁大学发起的一个开源项目,目的是帮助 Web 应用系统构建一种可靠的单点登陆解决方案,从目前企业实际项目来看,CAS 仍是很是受欢迎的一种单点登陆解决方案。浏览器
CAS 分为两部分:tomcat
咱们来看 CAS 的官方给出的一个架构图:
能够看到,用户访问的是 CAS Clients,CAS Clients 和 CAS Server 之间的通讯支持多种协议,CAS Server 处理具体的认证事宜,CAS Server 对数据源的支持也很是多样化。
CAS Client 支持的平台有:
CAS 支持的通讯协议有:
从图中也能够看出 CAS 支持多种不一样的认证机制,具体有:
在 CAS 的整个登陆过程当中,有三个重要的概念,这里我先来和你们捋一捋。
接下来咱们经过一张官方给出的流程图来看下 CAS 登陆过程是什么样子的!
这张图其实画的比较清楚了,我再用文字和你们解释下:
术语:应用一、应用2 分别表示被保护的应用。
在整个登陆过程当中,浏览器分别和 CAS Server、应用一、应用2 创建了会话,其中,和 CAS Server 创建的会话称之为全局会话,和应用一、应用2 创建的会话称之为局部会话;一旦局部会话成功创建,之后用户再去访问应用一、应用2 就不会通过 CAS Server 了。
说了这么多,来点实际的。
因为整个 CAS 单点登陆作起来还比较麻烦,咱们一步一步来,今天我先来教你们把 CAS Server 搭建起来。
目前最新的 CAS Server 是 6.x,这个是基于 gradle 来构建的,考虑到不少小伙伴可能不熟悉 gradle 操做,所以这里我选择 5.3 的版本,该版本基于你们熟悉的 maven 来构建。
官方为咱们提供了构建 CAS Server 的模版,地址是:https://github.com/apereo/cas...。
咱们在分支中选择 5.3 版本下载:
或者直接 clone 下来,而后切换到 5.3 这个分支也能够。这个应该就不用我教你们了吧,相信小伙伴们都能本身搞定。
CAS Server 从版本 4 开始,要使用 HTTPS 通讯,因此咱们得提早准备 HTTPS 证书。公司里的项目的话,须要购买 HTTPS 证书,本身玩的话也能够从云服务厂商那里申请到免费的 HTTPS 证书。
如今咱们在本地测试,直接利用 JDK 自带的 keytool 工具,本身生成一个 HTTPS 证书便可。
生成命令以下:
keytool -genkey -alias casserver -keyalg RSA -keystore ./keystore
证书在执行的时候,须要给一个密钥库口令,这个你们随意给出便可,可是给出了多少要本身记着。另外,在 What is your first and last name?
选项中,须要填入 CAS Server 的域名,这点切记:
如此以后,咱们的 HTTPS 证书就有了,虽然这个证书不被各大厂商承认,可是本身作练习够用了。
接下来进行配置。
咱们在下载的 cas-overlay-template 项目中,新建 src/main/resources 目录,并将 overlays/org.apereo.cas.cas-server-webapp-tomcat-5.3.14/WEB-INF/classes/application.properties 文件和刚刚生成的 keystore 文件拷贝进来:
而后修改 application.properties ,主要配置一下 keystore 的位置和密钥,以下:
server.ssl.key-store=classpath:keystore server.ssl.key-store-password=111111 server.ssl.key-password=111111
配置完成后,在项目根目录下执行以下命令启动项目:
./build.sh bootrun
根据我的网速,第一次启动可能会很是漫长,耐心等待便可。
启动过程当中,也可能会报错,可是不用管,若是看到 ready 图标,就表示启动成功了:
启动成功后,浏览器输入 https://cas.javaboy.org:8443/cas/login 就能够进入登陆页面了(注意是 https 哦):
默认的用户名是 casuser,密码是 Mellon,输入用户名密码就能够登陆了。
默认的用户名/密码也能够在 application.properties 文件中修改,该文件的最后一行:
cas.authn.accept.users=casuser::Mellon
修改完后,重启项目便可生效。
今天主要和小伙伴聊一下 CAS 的基本概念,而后咱们顺手搭建一个 CAS Server 出来,感兴趣的小伙伴能够动手试一试哦~,下篇文章咱们来看如何用 Spring Boot 开发 CAS 客户端~
好啦,若是小伙伴们以为有收获,记得点个在看鼓励下松哥哦~