cas-server 6.2.2 war-overlay 部署

CAS 6.2.x 单点登录

环境

  • 系统:Windows 10 企业版 LTSC 1809
  • 开发软件:Intellij IDEA 2020.1 (UltiMate Edition)
    • Intellij IDEA 还需要安装 Lombok 插件
  • Java:11.0.7 2020-04-14 TLS
  • Tomcat:apache-tomcat-9.0.38
  • Gradle: gradle-6.6.1
  • CAS Server: 6.2.x
  • CAS Client: 3.4.1

集成方式

使用官方推荐的 Overlay 方式,Overlay 方式只需下载 cas.war 包,然后只添加自己所需要的模块和配置,修改源码时,也只需要配置源码相同路径的代码,即可覆盖源码。这种方式减少了打包复杂度和打包效率,自定义代码在长期的迭代过程中出现未知,或者混乱的代码块,在升级 CAS 版本时也能够减少很大的工作量。

项目地址

项目的 hosts 配置

127.0.0.1 cas.example.org
127.0.0.1 client1.example.org
127.0.0.1 client2.example.org

Step1 拉取项目

git clone https://github.com/cas-projects/cas-sample-java-webapp 
git clone https://github.com/cas-projects/cas-sample-java-webapp cas-sample-java-webapp2
git clone -b 6.2 https://github.com/apereo/cas-overlay-template cas-server

Step2 导入项目到 IDEA 中

CAS Server 项目

这里 CAS Server 项目是 Gradle


s4meHoVaNh_20201003150655.png
image_20201003150903.png

导入后,等待构建完成后,右下角可以看到提示要启用 Lombok,点击启用即可

CAS Client 项目

这里 Client 项目是 Mavn 项目


image_20201003151416.png

Client 2 同上的方式导入到 IDEA 中
最终如下图三个项目

image_20201003151620.png

Step3 配置 Tomcat 容器

CAS Server 项目

image_20201003151942.png
image_20201003152144.png
image_20201003152342.png

如下图配置,为 Tomcat 添加 War 包,并修改项目 URL 前缀,


image_20201003152556.png

Client 项目

Client1

配置 Tomcat 同 CAS Server 一样,配置URL分别为 Client1 和 Client2

image_20201003153007.png

Client2

image_20201003153136.png

Step4 修改配置

CAS Server 配置修改

application.yml

cas:  
  server:  
    name: http://cas.example.org:8080  
    prefix: ${cas.server.name}/cas  
  authn:  
    accept:  
      # 登录账号,默认为 casuser::Mellon  
      users: admin::admin  
  service-registry:  
    # 是否重新读取 json  
    init-from-json: true  
    json:  
      # 服务注册时读取的 json 文件位置  
      location: file:E:\\26-cas\\cas-overlay-template\\etc\\cas\\services  
  tgc:  
    # Cookies 保存时,http 需要设置该值为false,否则无法保存Cookies成功  
    secure: false

项目结构如图下,1和2位置需要对应


image_20201003154412.png

添加 json 服务注册的支持的依赖
在 build.gradle 中,配置如图下


image_20201003155227.png

HTTPSandIMAPS-10000001.json

{  
  "@class": "org.apereo.cas.services.RegexRegisteredService",  
  "serviceId": "^(http|https|imaps)://.*",  
  "name": "HTTPS and IMAPS",  
  "id": 10000001,  
  "description": "This service definition authorizes all application urls that support HTTPS and IMAPS protocols.",  
  "evaluationOrder": 10000  
}

HTTPSandIMAPS-10000001.json 文件来自,如下图,使用 explodeWar 命令从 cas.war包中解压出,然后从build/cas-resources/servers/ 中复制出来,还可以使用 getResource 命令直接复制指定文件出来,这里提个醒,getResource 命令在 Windows 下还需手动修改下 gradle 脚本中拷贝文件时使用的路径分隔符。


image_20201003154639.png

拷贝出来后,ServicesId 像中添加 http 的支持

"serviceId": "^(http|https|imaps)://.*",

Client 配置

只需修改 webapp/WEB-INF/web.xml 中如下图5个位置的配置
client2,在下图中3,5中配置的url修改对应的地址即可,就不赘述了


image_20201003155809.png

如下图位置注释:
否则CAS server 端会有: <No multifactor authentication providers are available in the application context to satisfy [[mfa-duo]]>


image_20201009155459.png

Step5 编译打包运行

CAS Server

因为是 Overlay 的方式,修改配置文件还需要将配置文件打包进 War 包内,所以需要执行下面命令

gradlew.bat clean copyCasConfiguration build

gradlew 可以如下图方式,先直接用浏览器下载到本地,然后修改配置读取本地 gradle


image_20201003161240.png

编译打包后,运行如下


image_20201003161358.png

Client2 同理

Step6 抓包验证单点登录的过程

  1. 浏览器输入 http://client1.example.org:9081/client1 并回车进入
    如下图,请求 client1 后会返回 302 ,并跳转到 cas server 的登录界面

    image_20201003162159.png

  2. 输入账号密码登录

    1. 请求 login 登录接口验证成功后返回302重定向到 client 携带这 ticket=ST-xxx 并且设置了 cookie (Set-Cookie)
    2. client1 后端接到带有 ticket=ST-xxx 的请求,然后回去请求 cas.example.org 验证 这个 ST-xxx ,验证成功回返回 302 重定向回用户真正想访问的资源,如下图的标号5为验证ST的请求,6 为验证成功后重定向的地址并且,设置了 client1 的 Cookie


      image_20201003162503.png

登录成功后最终 Chrome 浏览器内的Cookie 如下


image_20201003163423.png
image_20201003163134.png
image_20201003163153.png
  1. 输入 client2 地址
    浏览器输入: http://client2.example.org:9082/client2/ 并回车,可以看到直接登录了
  1. client2 先重定向到 cas.example.org 并带上 Service
  2. 由于上面 Client1 登录了,并设置 cas.example.org 的 Cookie 这是请求登陆时就带上了这个 Cookie 如图中标号3
  3. cas.example.org 验证这个 Cookie 成功后,表示是登录状态,又返回 302 并带上服务的 ticket=ST-xxx 重定向 client2 如图标号4
  4. 如图标号5 client2 接收并到CAS 中验证该 ticket=ST-xxx ,验证成功后再 返回 302 ,将调转到最终的用户想访问的资源页面,如图标号6


    image_20201003163856.png

问题

在上面验证中,可能会碰到 Cookie 无法保存的问题,导致进入 client2 时还是要登录,后面发现问题是 Chrome 80+版本中 secure 设置 false 则SameSite不能设置为 None。

如下图,F12 控制台查看请求,查为什么 Cookie 没有保存


image_20201003165749.png

解决方式

  1. 配置 same-site-policy=none|lax|strict Cookie 属性


    image_20201003214132.png
  2. Chrome 忽略该问题的方式
    如下图禁用该属性


    image_20201003170303.png

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容