CAS单点登录示例

摘要

CAS Server Cas Client Pac4j

什么是单点登录

单点登录(Single Sign On),简称 SSO,常用于多个系统中,用户只需登录一次,就可以访问其他信任的系统。比如,员工登录过OA系统后,可以直接访问邮件系统,而不再需要登录邮件系统。这里的OA系统和邮件系统,可以认为是相互信任的子系统,他们共用一套用户数据,这套用户数据的权限认证由统一的认证服务器来认证。

CAS协议

现阶段比较流行的单点登录解决方案是CAS(Central Authentication Service),官网中有如下说明

Enterprise Single Sign-On - CAS provides a friendly open source community that actively supports and contributes to the project. While the project is rooted in higher-ed open source, it has grown to an international audience spanning Fortune 500 companies and small special-purpose installations.

CAS提供了CAS协议来完成单点登录,主要流程如下

  1. 用户第一次向浏览器访问应用1(https://app.example.com),应用1判断用户没有登录,重定向到CAS server(https://cas.example.com/cas/login?service=https://app.example.com)

  2. CAS server中判断当前用户的sso的session不存在,展示用户名密码输入框

  3. 用户输入用户名密码向CAS server登录,验证通过后,CAS server 生成sso的session,向浏览器设置cookie,CASTGC=TGT-...
    其中cookie的值就是sso中session的key。同时CAS server会对应用1生成一个ticket,再去重定向到应用1中,应用1拿到这个ticket再次请求CAS server获取授权数据。成功后,设置cookie,jessionid=...。到此,应用1第一次认证结束。

  4. 当应用1第二次认证的时候直接校验jessionid是否合法即可。

  5. 当应用2第一次访问的时候,同样会重定向到CAS server中去,只不过,此时,由于,应用1已经认证通过了,同时sso的session已经保存了,所以,CAS server不会再去要求用户登录,而是直接对应用2生成一个ticket,后面的逻辑就和前面一样了。

代码演示

下面的代码都可以在cas-pac4j-example下载
本机环境说明

  • jdk 1.8
  • maven 3.6.3
  • mysql 5.7.29
  • cas server 5.3.14
  • cas client 3.6.1
  • shiro 1.5.3
  • pac4j 4.0.3

cas服务端

直接clone官方提供的overlaygit clone https://github.com/apereo/cas-overlay-template.git
由于最新版6.3.x需要jdk11的支持,所以切换了5.3的分支
添加了src/main/resources/目录,在改目录下创建了application.properties文件和services目录,用于cas server的自定义认证方式。
由于认证数据依赖数据库,请先运行sql文件,更改application.properties的数据库连接信息。
修改pom文件,添加如下依赖

        <dependency>
            <groupId>org.apereo.cas</groupId>
            <artifactId>cas-server-support-rest</artifactId>
            <version>${cas.version}</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <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>

命令行运行mvn clean package & java -jar target/cas.war等待服务启动后,访问http://locahost:8443/cas,会跳转登录,输入u/p登录成功。到此,cas服务端算是ok了。

cas客户端

新建spring boot项目cas-client2cas-client3,其中cas-client2的端口为8082,cas-client3的端口为8083,pom中添加如下依赖

        <dependency>
            <groupId>org.jasig.cas.client</groupId>
            <artifactId>cas-client-support-springboot</artifactId>
            <version>${cas.client.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

添加注解@EnableCasClient启用casClient,application中添加如下cas服务配置

cas.server-url-prefix=http://localhost:8443/cas
cas.server-login-url=${cas.server-url-prefix}/login
cas.client-host-url=http://localhost:${server.port}

启动客户端cas-client2和cas-client3,访问http://localhost:8082,会跳转cas登录,然后在访问http://localhost:8083,会发现已经认证通过,不会跳转cas登录,达到了单点登录的效果。

客户端shiro集成cas服务认证

现实的系统中可能不是像上面那样简单的配置,可能客户端先前已经集成了shiro等权限框架,后面再接入cas认证,这种情况怎么处理呢?
新建spring boot项目cas-client1
pom中添加入下依赖

        <dependency>
            <groupId>io.buji</groupId>
            <artifactId>buji-pac4j</artifactId>
            <version>${buji.version}</version>
        </dependency>
        <dependency>
            <groupId>org.pac4j</groupId>
            <artifactId>pac4j-cas</artifactId>
            <version>${pac4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring-boot-web-starter</artifactId>
            <version>${shiro.version}</version>
        </dependency>

application.properties的配置如下

server.port=8081

cas.server-url-prefix=http://localhost:8443/cas
cas.server-login-url=${cas.server-url-prefix}/login
cas.client-host-url=http://localhost:${server.port}
cas.client-name=app-client1

shiro.loginUrl=/login.html

主类中CasClient1Application添加了cas认证的相关配置,而TestController则包含了单纯的shiro登录和cas的rest方式登录。
启动后,访问http://localhost:8081/cas.html,会跳转到CAS Server去认证,认证完成后,访问http://localhost:8081/test可以测试权限数据是否正确,CAS Server除了采用CAS本身的login登录界面外,还支持rest的方式,获取认证,访问http://localhost:8081/login.html,输入u/p后会通过rest的方式认证。

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