上篇文章介绍了SSO的原理以及5种基本流程,相信看完了之后不难理解单点登录,而CAS是SSO的一种实现方案,原理是一样的。下面介绍一下。

CAS Server:负责完成对用户的认证工作,需要独立部署,CAS Server会处理用户名/密码等凭证。

CAS Client:负责处理对客户端受保护资源的访问请求,需要对请求方进行身份认证时,重定向到CAS Server进行认证。CASClient与受保护的客户端应用部署在一起,以Filter方式保护受保护资源。

CAS请求认证图

说明:CAS Client与受保护的客户端应用部署在一起,以Filter方式保护Web应用的受保护资源,过滤从客户端过来的每一个web请求,同时,CAS Client会分析HTTP请求中是否包含请求Service Ticket,如果没有,则说明该用户是没有经过认证的;于是CAS Client会重新定向到CASServer(传递Service<要访问的资源地址>+cookie)。CAS Server验证TGT失败返回登录页面。输入认证信息,如果Credentials认证信息成功,CAS Server随机产生一个相当长度、唯一、不可伪造的Service Ticket,并缓存以待将来验证,并重定向到Service所在地址,并为客户端浏览器设置一个Ticket Granted Cookie;Cas Client 在拿到Service和新产生的Ticket过后,在CAS Server进行验证,验证成功后,进行缓存。

经过分析发现,CAS请求认证图和上篇文章的SSO认证图是大同小异的。

实例

两个CAS Client实现单点登录效果,登录进去之后显示更多的验证信息:(以tomcat中的示例example为例做测试)

服务器:tomcat 6.0

一、CAS Server部署

解压cas-server-3.5.2-release.zip(提取cas-server-3.5.2-release.zip\cas-server-3.5.2\modules\cas-server-webapp-3.5.2.war,重命名为cas.war)部署到tomcat中。

二、CAS Client配置:

1、\WEB-INF\lib下添加jar包

cas-client-core-3.2.0(cas-client-3.2.0-release.zip解压提取cas-client-3.2.0/modules/cas-client-core-3.2.0)

commons-logging-1.1.1

2、web.xml配置拦截器(client1为例)

 <listener><listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class></listener>
<!-- 该过滤器用于实现单点登出功能,可选配置。 --><filter><filter-name>CASSingle Sign Out Filter</filter-name><filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class></filter><filter-mapping><filter-name>CASSingle Sign Out Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
<filter><filter-name>CASFilter</filter-name><filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class><init-param><param-name>casServerLoginUrl</param-name><param-value>http://localhost:8080/cas/login</param-value></init-param><init-param><param-name>serverName</param-name><param-value>http://localhost:18080</param-value></init-param></filter><filter-mapping><filter-name>CASFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- 该过滤器负责对Ticket的校验工作,必须启用它 --><filter><filter-name>CASValidation Filter</filter-name><filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class><init-param><param-name>casServerUrlPrefix</param-name><param-value>http://localhost:8080/cas</param-value></init-param><init-param><param-name>serverName</param-name><param-value>http://localhost:18080</param-value></init-param></filter><filter-mapping><filter-name>CASValidation Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
<!--该过滤器负责实现HttpServletRequest请求的包裹,比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。--><filter><filter-name>CASHttpServletRequest Wrapper Filter</filter-name><filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class></filter><filter-mapping><filter-name>CASHttpServletRequest Wrapper Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
<!--该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。比如AssertionHolder.getAssertion().getPrincipal().getName()。--><filter><filter-name>CASAssertion Thread Local Filter</filter-name><filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class></filter><filter-mapping><filter-name>CASAssertion Thread Local Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

3、同理在client2的web.xml配置同上,注意修改端口号

4、页面显示更多的凭证信息

代码:HelloWorldExample.java里面添加代码:

Assertion assertion = (Assertion)request.getSession().getAttribute(AbstractCasFilter.CONST_CAS_ASSERTION);
if (null != assertion){out.println(" Log | ValidFromDate=:"+assertion.getValidFromDate() + "<br>");out.println(" Log | ValidUntilDate=:"+assertion.getValidUntilDate() + "<br>");Map<String, Object> attMap =assertion.getAttributes();out.println(" Log | getAttributesMap size = " + attMap.size()+"<br>");for (Entry<String, Object> entry: attMap.entrySet()) {out.println("     | " + entry.getKey() + "=:"+entry.getValue() + "<br>");}AttributePrincipal principal =assertion.getPrincipal();
//AttributePrincipalprincipal = (AttributePrincipal) request// .getUserPrincipal();
String username = null;out.print(" Log |UserName:");if (null != principal) {username = principal.getName();out.println("<spanstyle='color:red;'>" + username+"</span><br>");}
}

5、测试验证:

输入client1网址:http://localhost:18080/examples/servlets/servlet/HelloWorldExample

跳转到登录页面:

输入用户名,密码:admin,admin

跳转页面

看返回地址,在这里返回一个ST给client端,缓存起来。

接着访问client2,网址:http://localhost:28080/examples/servlets/servlet/HelloWorldExample,不用输入用户名和密码,跳转到client2的业务页面:

看输入链接,只有本地的链接

原理:根据Cookie验证是否已经登录

注:如果访问有问题,则修改安全认证的安全级别,cas默认的是HTTPS协议,如果对安全的要求不高,可使用HTTP协议。

修改默认协议如下:

修改deployerConfigContext.xml 增加参数p:requireSecure="false",是否需要安全验证,即HTTPS,false为不采用。

<beanclass="org.jasig.cas.authentication.handler.support.HttpBasedServiceCredentialsAuthenticationHandler"p:httpClient-ref="httpClient"
p:requireSecure="false"/>修改ticketGrantingTicketCookieGenerator.xml(cas/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml) 中ticketGrantingTicketCookieGenerator p:cookieSecure 属性 修改为 false。<beanid="ticketGrantingTicketCookieGenerator"class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator"
p:cookieSecure="false"p:cookieMaxAge="-1" p:cookieName="CASTGC"p:cookiePath="/cas" />

总结

通过cas,系统之间解耦,并且不用开发人员再单独去开发信息认证系统,统一的信息管理平台,大大简化了开发。

附源码

SSO(Single Sign On)系列(三)--CAS单点登录相关推荐

  1. 爆破专栏丨Spring Security系列教程之实现CAS单点登录上篇-概述

    作者:千锋一一哥 前言 从本章节开始,一一哥 会给各位讲解一个很常见也很重要的知识点,就是单点登录!现在的大型分布式项目,基本都会考虑实现单点登录,而且现在网上也有很多单点登录的实现方案.开源项目,但 ...

  2. java培训爆破专栏之Spring Security系列教程之实现CAS单点登录上篇-概述

    作者:千锋一一哥 前言 从本章节开始,一一哥 会给各位讲解一个很常见也很重要的知识点,就是单点登录!现在的大型分布式项目,基本都会考虑实现单点登录,而且现在网上也有很多单点登录的实现方案.开源项目,但 ...

  3. SSO之CAS单点登录详细搭建

    2019独角兽企业重金招聘Python工程师标准>>> SSO之CAS单点登录详细搭建 : 环境说明: 同一个机器上环境如下: 操作系统:windows7 64位 JDK版本:1.7 ...

  4. xxl-sso kisso cas三个单点登录系统分析

    xxl-sso kisso cas三个单点登录系统分析 xxl-sso 统一在一个地方登录 客户端和服务端同时连接一个redis 登录成功后将用户信息写入redis. 登录成功返回 sessionId ...

  5. CAS单点登录-配置中心(三)

    CAS单点登录-配置中心(三) 本章计划及内容 计划: 微服务概念 配置中心充当角色 搭建配置中心 cas连接配置中心 内容: 采用 spring cloud Dalston SR3搭建配置中心 采用 ...

  6. CAS单点登录原理简单介绍

    1. SSO简介 1.1 单点登录定义 单点登录(Single sign on),英文名称缩写SSO,SSO的意思就是在多系统的环境中,登录单方系统,就可以在不用再次登录的情况下访问相关受信任的系统. ...

  7. CAS 单点登录/登出 系统

    前言: 在我们的实际开发中,更多的是采用分布式系统.那么问题来了,对于分布式系统的登录问题,我们如何解决呢? 如果说我们在每一个系统中都要进行一次登录,那么用户体验度也就差的没法用了.以京东商城为例, ...

  8. CAS单点登录原理解析及相关配置

    1.基于Cookie的单点登录的回顾 基于Cookie的单点登录核心原理: 将用户名密码加密之后存于Cookie中,之后访问网站时在过滤器(filter)中校验用户权限,如果没有权限则从Cookie中 ...

  9. CAS单点登录的实现(二)

    这篇文章对CAS单点登录具体实现的一些步骤就行讲述,至于CAS单点登录的实现原理分析,请参看下面这篇文章: CAS单点登录原理分析(一) https://blog.csdn.net/qq_412582 ...

  10. CAS单点登录的实现

    这篇文章对CAS单点登录具体实现的一些步骤就行讲述,至于CAS单点登录的实现原理分析,请参看下面这篇文章: CAS单点登录原理分析(一) https://blog.csdn.net/qq_412582 ...

最新文章

  1. python适合找哪方面工作_学习python后能做哪方面的工作
  2. LWIP之TCP协议
  3. 关于table的那些用法(一)
  4. e83服务器电源键位置,正文-新华三集团-H3C
  5. 高通针对LED应用的点阵字库解决方案 — 支持多种字号字体显示
  6. Swift3.0语法1
  7. css居中的几种方法_css两种常用的不定宽高的水平垂直居中方法,记住它,不再为样式发愁...
  8. AT89C51的矩阵键盘、跑马灯和呼吸灯设计
  9. 【主动轮廓模型(二)】《GVF Snake》算法原理与OpenCV实现
  10. excel文件设置的工作表保护如何撤销
  11. cocos2dx基础篇(14)——基本绘图DrawPrimitives
  12. 人生最大的难题是认清自己
  13. python3 读取.plist文件_在Python中解析plist文件
  14. 杀死一只知更鸟——派克的经典作品
  15. python爬取bilibili弹幕_python 爬取bilibili 视频弹幕
  16. disparity和parallax的区别
  17. 利用清华镜像站来汉化eclipse
  18. 这个团队做的事情,每天为美团平台带来50%以上的交易量
  19. SNMP中的MIB是什么? 讲解如何进行SNMP MIB的查看
  20. 智能卡 ISO14443 协议 解读

热门文章

  1. 《培根随笔》读书笔记 (一)
  2. 论文阅读之《Quasi-Unsupervised Color Constancy 》
  3. bars 除障句完整_简单的治愈系晚安朋友圈问候语锦集83句
  4. 用真金做的电路板——金手指
  5. java中两种异常类型_Java中的三种异常类型
  6. 林业调查规划资质全国林业单位办理认定标准和申请条件
  7. web测试方法总结 -- 非原创,存留一份
  8. idea火箭_火箭的大脑
  9. Python实现学生成绩管理系统
  10. Android面试题集1