基础名词
- CAS(Central Authentication Service),可以看作中心授权服务器
- SSO(Single Sign On),单点登录
SSO相关知识
- 同域SSO(blog.212490197.xyz和www.212490197.xyz)
- 同域SSO(blog.212490197.xyz和www.212490197.xyz)
- SSO单点登录主要用于一套ID,密码登陆一套或多套系统。就像登陆支付宝之后,在登陆淘宝可以自动登陆,不需要再进行账号密码的输入。
- 下边的图显示了SSO登陆流程与注销流程
- 用户与SSO认证中心建立的会话叫做全局会话。
- 用户与各个子系统建立的会话叫做局部会话。创建局部会话之后,用户与子系统之间交流受保护数据将不再需要使用认证中心认证。
- 局部会话与全局会话之间的关系
- 局部会话存在,全局会话存在(因为局部会话依赖于全局会话的认证)
- 全局会话存在,局部会话不一定存在(如果用户只是登陆了,但是没有使用任何一个子系统,则不存在局部会话)
- 全局会话销毁,局部会话必须销毁(总认证失效,局部认证不能存在)
- 在一个子系统中进行了注销,相当于在认证中心注销,会同时让所有的子系统进行注销。所以其他子系统在之后进行数据请求的时候发现已经注销,将不会再传输数据,直接跳到登陆界面。所有子系统都使用同一个令牌。
CAS相关知识
- CAS结构主要分为CAS Server和CAS Client
- CAS可以看作是一个票据协议。
- TGC(Ticket-Granting cookie) 授权的票据证明。由CAS Server通过SSL发送给终端用户。当作Key值
- TGT(Ticket-Granting Ticket) 用户的登陆票据(CAS签发),存储在TGCcookie中的代表用户的SSO会话。可用来判断用户是否在CAS登陆过。
- ST(Service Ticket) 访问某一服务的票据,作为参数以GET方式放到URL中
- PGT(Proxy Granting Ticket) 代理凭据,
- PGTIOU(Proxy Granting Ticket I Owe You) 附加票据
- PT(Proxy Ticket) 用于C/S结构,没有cookie的情况下。
- ST是TGT签发的
- PGT是ST签发的
- PT是PGT签发的
- KDC(Key Distribution Center) 密钥发放中心
- Authentication Service(AS) 认证服务,索取Crendential,发放TGT
- Ticket-Granting Service(TGS) 票据授权服务,索取TGT,发放ST
- 具体名词的实现过程可以参考该链接
- 图片引用出处,可以在这里查看一下具体的流程解释。
LDAP与Windows AD常识
具体过程
- 进入CAS客户端,判断用户是否登陆。
- 登陆的话直接显示客户端相关内容,没有登陆则进行CAS客户端跳转到CAS服务端
- CAS服务端已经编写好相关登陆界面,同时拥有企业微信二维码。
- 企业微信扫码,获取权限。经过OAuth2授权后获得用户信息,可以读取到用户唯一ID
- 根据用户唯一ID,自动登陆后台,获取TGC。
- 获取相应的TGT,通过TGT获取ST,将ST返回CAS客户端。
- CAS客户端拿ST去CAS服务端判断是否正确。正确则进行登陆
使用模板
使用工具
JDK11
- JDK配置PATH的时候,环境变量要放到最开始,以免被Oracle的默认JDK顶掉
Tomcat9
- HTTPS的配置
- 运行加入了JDBC的cas.war出现了ACTION: AUTHENTICATION_FAILED
MySQL5.7
Gradle
- windows和linux可以用同一个下载包
- 下载好之后,环境变量中
- GRADLE_HOME放gradle的根目录
- GRADLE_USER_HOME放gradle的根目录的.gradle。这样就不会将东西下载到C盘了
- 代理配置
- 修改项目的gradle.properties文件(参考博客)
方法一
org.gradle.jvmargs=-Xmx1536m -DsocksProxyHost=127.0.0.1 -DsocksProxyPort=1080
方法二
systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=1080
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=1080
Maven
- maven在idea的配置
- 下载好之后,环境变量中
- M2_HOME放maven的根目录
- 根目录的conf/settings.xml修改默认仓库路径如下
<localRepository>D:\\software\\Maven\\repository</localRepository>
- 代理配置
- 在settings.xml进行如下配置(参考该博客)
- proxies中可以配置多个proxy,但是默认第一个proxy生效。
- active中的TRUE表示该代理目前生效状态
- http协议、主机地址、端口不在赘述。
- 用户名密码按需配置即可。
- nonProxyHost表示不需要代理访问的地址。中间的竖线分隔多个地址,此处可以使用星号作为通配符号。
- 在settings.xml进行如下配置(参考该博客)
<proxies>
<proxy>
<id>ss</id>
<active>true</active>
<protocol>http</protocol>
<!-- <protocol>socks</protocol> -->
<!-- <username>代理账号</username> -->
<!-- <password>代理密码</password> -->
<host>127.0.0.1</host>
<port>1087</port>
<!-- <nonProxyHosts>local.net|some.host.com</nonProxyHosts> -->
</proxy>
</proxies>
虚拟机相关设置
我在笔记本上装了虚拟机来部署linux服务器。版本使用的是CentOS-7-x86_64-Minimal-2003.iso,由于网易的其他单独的版本都被删掉了,readme上写着得去官网下载。所以我就直接下载了这个。参考地址是这里。
虚拟机里边的linux装好之后,进行xshell的连接,这里主要参考了这篇文章。我在配置CAS的时候,测试了CAS5.x和CAS6.x的版本,用了两个不同的虚拟机,我原来想使用同样的IP来进行访问。但是发现当两个机器都被挂起的时候,好像这样就不能用了,所以一台的子网IP配置了192.168.241.3,另一台配置了192.168.241.4.(只要最后的数字不同即可)
# ip配置
子网IP 192.168.241.3 # 或者改成192.168.241.4
子网掩码 255.255.255.0
网关IP 192.168.241.2
可以使用xshell之后,虚拟机就没什么用了。开启之后放在那里就行。接下来进行CentOS下载源的配置,这里使用阿里的下载源。配置方法参考这里。因为安装的minimal中没有wget这个包,所以我直接将链接内容下载下来,用notepad++打开后,粘贴到xshell中的。保存后,进行yum makecache即可进行其他软件的下载。我就是因为子网IP配置成同样的了,这里老是yum makecache不成功。所以记得不同机器IP配置为不同即可
IP相同,有一个最大的问题就是ping www.baidu.com
会提示找不到。
另外,会有情况是虚拟机设置好了静态IP,xshell仍旧无法连接,可以参考这个文章。勾选其中的一个东西就可以了。
设置好之后,用yum来安装一些软件
yum install -y wget lrzsz net-tools # 使用-y会自动选择安装的包,可以参考这里 https://blog.csdn.net/aiynmimi/article/details/76819961
运行的时候需要开启一些端口,这里可以参考这篇文章。
这里列出一些会用到的命令
firewall-cmd --zone=public --add-port=80/tcp --permanent # 开端口命令
firewall-cmd --zone=public --remove-port=80/tcp --permanent # 关端口命令
systemctl restart firewalld.service # 重启防火墙
firewall-cmd --list-ports # 查看开启的所有端口
主要流程
- 1 下载CAS-Overlay-template。因为CAS6.x已经使用Gradle来进行构建了,所以下边的操作需要Gradle的支持
- 2 下载好之后,可以在项目的根目录打开build.gradle文件进行配置(Gradle的配置文件,下载源,相关依赖包都在这里配置)。
- 如果不熟悉Gradle脚本可以先在这里进行相关的了解学习。
- 以下进行注释的地方都是修改过的地方。其他地方均使用原脚本内容。
buildscript {
repositories {
// 从本地maven仓库进行依赖的查找
mavenLocal()
gradlePluginPortal()
// 配置阿里源的仓库,这样对于依赖的下载会更加快
maven {
url 'http://maven.aliyun.com/nexus/content/groups/public/'
}
maven {
url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
}
mavenCentral()
jcenter()
maven {
url "https://repo.spring.io/libs-milestone"
mavenContent { releasesOnly() }
}
maven {
url "https://repo.spring.io/libs-snapshot"
mavenContent { snapshotsOnly() }
}
maven {
url "https://plugins.gradle.org/m2/"
mavenContent { releasesOnly() }
}
}
dependencies {
classpath "de.undercouch:gradle-download-task:${project.gradleDownloadTaskVersion}"
classpath "org.springframework.boot:spring-boot-gradle-plugin:${project.springBootVersion}"
classpath "gradle.plugin.com.google.cloud.tools:jib-gradle-plugin:${project.jibVersion}"
classpath "io.freefair.gradle:maven-plugin:${project.gradleMavenPluginVersion}"
classpath "io.freefair.gradle:lombok-plugin:${project.gradleLombokPluginVersion}"
}
}
// 为所有的项目添加阿里源
allprojects {
repositories {
maven {
url 'http://maven.aliyun.com/nexus/content/groups/public/'
}
maven {
url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
}
}
}
// 添加相关依赖项
dependencies {
// Other CAS dependencies/modules may be listed here...
//Service配置
implementation "org.apereo.cas:cas-server-support-json-service-registry:${casServerVersion}"
// 使CAS服务端支持LDAP模式的查询。后边需要在application.properties中进行相关配置
implementation "org.apereo.cas:cas-server-support-ldap:${project.'cas.version'}"
// 用于获取TGT和ST。引入之后就可以通过v1/tickets获取这两个参数了,不需要其他配置。
compile "org.apereo.cas:cas-server-support-rest:${project.'cas.version'}"
// 自定义认证需要引入的两个依赖包
implementation "org.apereo.cas:cas-server-core-authentication-api:${project.'cas.version'}"
implementation "org.apereo.cas:cas-server-core-configuration-api:${project.'cas.version'}"
// 阿里的JSON处理依赖包。用于返回给前台JSON数据时进行数据组装
compile group: 'com.alibaba', name: 'fastjson', version: '1.2.47'
// HTTPClient相关依赖包,用来进行后边HTTPS相关请求的处理
compile group: 'org.apache.commons'