一、流程说明

第一步:访问cas过滤链接ssoLogin,拼凑定向到 CAS_SERVER 获取ticket的URL

第二步:CAS_SERVER校验用户信息,生成Ticket

第三步:重新定向到访问客户端的ssoLogin并附加Ticket参数和值

第四步:根据传来的Ticket拼凑定向到CAS_SERVER的连接去校验Ticket的合法性

第五步:CAS_SERVER校验成功后,会返回XML报文并重新定向到访问客户端的ssoLogin
    解析该XML报文,构造用户信息对象存储在session中
    然后根据ssoLogin设置的loginSuccessUrl跳转到登录成功后的访问页面

二、具体步骤

1、导入所需依赖jar包

2、在web.xml中配置需要单点登录过滤的路径为/ssoLogin

本地客户端URL:http://localhost:8080/webtest/ssoLogin

远程cas服务器地址CAS_LOGIN_URL:https://192.168.6.100/ptyhzx-sso/login

web.xml配置

ssoclient.properties配置

3、流程剖析

(1) 访问ssoLogin[处理类:SSOServlet]带上用户名和密码 - requestUrl

https://localhost:8080/webtest/ssoLogin?username=user1&password=123456

(2) 构造第一次访问CAS_SERVER的getTicketURL

getTicketURL = CAS_LOGIN_URL ? SERVICE参数

目的:获取TICKET

http://192.168.6.100/ptyhzx-sso/login?service=http%3A%2F%2Flocalhost%3A8080%2Fwebtest%2FssoLogin%3Frenew=true&other=form&accessToken=C45BD9AE005909FE2F9EC45D54FF70D2ADD106142B17461AEC94AD4A098A7420025D7694680916B5276CDDE8FA085C5A
说明:

后台根据 requestUrl 构造 service 参数

service的值 = 去掉用户名密码后的requestUrl参数 + renew参数 + other参数 + 用户名密码加密后的accessToken

拼接完毕后再对service整体编码作为最终的service值

构造获取getTicektURL完毕后立刻重定向到该URL去

(3) CAS_SERVER根据accessToken验证用户信息

验证成功

1、生成TOKEN【示例:ST-5649-Wv3HsI75tG7dNzEu9Uxg-cas01.example.org】

2、重定向到requestURL,此时requestURL中包含了ticket参数

http://localhost:8080/webtest/ssoLogin;jsessionid=DBFC81A7ECA2C24C90B2AB5440475E05&ticket=ST-5649-Wv3HsI75tG7dNzEu9Uxg-cas01.example.org

验证失败,跳转到配置的loginFailureURL并提示具体错误信息

(4) 根据得到的ticket调用验证方法:

Assertion vaildAssertion = ticketValidator.validate(ticket,requestURL);

调用validate方法会构造验证的 validURL 去CAS服务器验证这个TICKET是否合法

validateURL =

CAS_SERVER_URL/serviceValidate? + ticket参数 + serviceCode参数 + service参数

service参数是验证成功后重定向的URL地址

http://192.168.6.100/ptyhzx-sso/serviceValidate?ticket=ST-5653-dURt1ErNHUuEm9j3vsqe-cas01.example.org&serverCode=101&service=http%3A%2F%2Flocalhost%3A8080%2Fwebtest%2FssoLogin

String serverResponse = retrieveResponseFromServer(new URL(validationUrl), ticket);

(6)验证成功后cas_server会返回xml报文到重定向的URL地址

<!-- 成功时 -->
<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
<cas:authenticationSuccess>
<cas:user>a1</cas:user>
<cas:attributes>
<cas:id>1100000000000000000</cas:id> <cas:sex>1</cas:sex> <cas:username></cas:username> <cas:authenticationMethod>com.jeaw.sso.adaptors.jdbc.QueryDatabaseAuthenticationHandler</cas:authenticationMethod> <cas:email></cas:email> <cas:nickname>a1</cas:nickname> <cas:status>1</cas:status> <cas:cellphone></cas:cellphone> <cas:usertype>03</cas:usertype> <cas:loginid>1000000001</cas:loginid> <cas:password>111111</cas:password> </cas:attributes>
</cas:authenticationSuccess>
</cas:serviceResponse> <!-- 失败时 -->
<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
<cas:authenticationFailure code='INVALID_TICKET'>
未能够识别出目标 'ST-136-Tnw7BLEKurYGcDaZFgo6-cas01.example.org'票根
</cas:authenticationFailure>
</cas:serviceResponse>

(7) 后续操作

1、调用parseResponseFromServer(serverResponse)解析该报文以生成 Assertion 对象 
  vaildAssertion 2、构造用户信息对象存于session   request.getSession().setAttribute("userInfo",vaildAssertion); 3、跳转到登陆成功页面   response.sendRedirect(loginSuccessUrl);

(8) 交互流程一览

(9)参考文档

单点登录SSO的实现原理

CAS实现SSO单点登录原理

类 Cas20ServiceTicketValidator

基于CAS实现单点登录(SSO):登录成功后,cas client如何返回更多用户信息

[sso] 单点登录认证流程的更多相关文章

  1. SSO 单点登录简单流程(cas)

    配置服务端(链接数据库) 第一步: 下载cas-server端,解压开, 将中的解压开,将该包中的内容放入cas文件夹(新建文件夹)中 然后将这个文件夹放入到服务端的服务器(tomcat)中 将解压开 ...

  2. CAS单点登录详细流程

    一.CAS简介和整体流程 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目.CAS ...

  3. (十一) 整合spring cloud云架构 - SSO单点登录之OAuth2.0登录流程(2)

    上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名+密码实现OAuth2.0的 ...

  4. Spring Cloud云架构 - SSO单点登录之OAuth2.0登录流程(2)

    上一篇是站在巨人的肩膀上去研究OAuth2.0,也是为了快速帮助大家认识OAuth2.0,闲话少说,我根据框架中OAuth2.0的使用总结,画了一个简单的流程图(根据用户名+密码实现OAuth2.0的 ...

  5. NET Core 2.0使用Cookie认证实现SSO单点登录

    NET Core 2.0使用Cookie认证实现SSO单点登录 之前写了一个使用ASP.NET MVC实现SSO登录的Demo,https://github.com/bidianqing/SSO.Sa ...

  6. CAS实现SSO单点登录原理

    1.      CAS 简介 1.1.  What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...

  7. cas sso单点登录系列2:cas客户端和cas服务端交互原理动画图解,cas协议终极分析

    转:http://blog.csdn.net/ae6623/article/details/8848107 1)PPT流程图:ppt下载:http://pan.baidu.com/s/1o7KIlom ...

  8. CAS实现SSO单点登录原理(转)

    1.      CAS 简介 1.1.  What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...

  9. Docker 创建 Bamboo6.7.1 以及与 Crowd3.3.2 实现 SSO 单点登录

    目录 目录 1.介绍 1.1.什么是 Bamboo? 2.Bamboo 的官网在哪里? 3.如何下载安装? 4.对 Bamboo 进行配置 4.1.获取授权许可 4.2.一般配置 4.3.数据库配置 ...

随机推荐

  1. sql 集合运算

    UNION 并运算 UNION 操作符用于合并两个或多个 SELECT 语句的结果集. 请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列.列也必须拥有相似的数据类型.同时,每条 SE ...

  2. 【leetcode❤python】 290. Word Pattern

    #-*- coding: UTF-8 -*-class Solution(object):    def wordPattern(self, pattern, str):        "& ...

  3. C# 返回Foreach集合

    IEnumerable<DataRow> DetailRows()       {           foreach (DataRow dr in EditData.Tables[tb_ ...

  4. Response.Cookies 和 Request.Cookies

    Response.Cookies 和 Request.Cookies     原文地址: http://www.cnblogs.com/forcertain/archive/2012/12/04/28 ...

  5. netstat -ano,查看已占用端口,结束已被占用的端口,ntsd,关闭任务管理器杀不了的进程

    cmd——回车,输入netstat -ano——回车,可以查看已占用的端口,记下端口的PID,然后打开任务管理器,点查看,选择列,勾选PID确定,找到对应的PID,结束进程,如果结束不了或者结束后还不 ...

  6. HDU 3549 Flow Problem(最大流)

    HDU 3549 Flow Problem(最大流) Time Limit: 5000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/ ...

  7. JS学习笔记(二) 数据类型

    参考资料: 1. http://www.w3school.com.cn/js/js_datatypes.asp 2. http://blog.sina.com.cn/s/blog_85c1dc1001 ...

  8. 【T-SQL系列】常用函数—聚合函数

    聚合函数平均值AVG.标准偏差STDEV.方差VAR.最大值MAX.最小值MIN.合计SUM.次数COUNT.极差值MAX-MIN.变异系数STDEV/AVG*100 什么是统计统计 就是通过样本特性 ...

  9. [poj2785]4 Values whose Sum is 0(hash或二分)

    4 Values whose Sum is 0 Time Limit: 15000MS Memory Limit: 228000K Total Submissions: 19322 Accepted: ...

  10. iOS - OC 与 Swift 互相操作

    前言 在 Swift 语言中,我们可以使用 Objective-C.C 语言编写代码,我们可以导入任意用 Objective-C 写的 Cocoa 平台框架.Objective-C 框架或 C 类库. ...