900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > CAS方案实现单点登录SSO

CAS方案实现单点登录SSO

时间:2022-09-05 19:38:54

相关推荐

CAS方案实现单点登录SSO

一、单点登录SSO

1、什么是单点登陆

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

较大的企业内部,一般都有很多的业务支持系统为其提供相应的管理和IT服务。

例如财务系统为财务人员提供财务的管理、计算和报表服务;

人事系统为人事部门提供全公司人员的维护服务;

各种业务系统为公司内部不同的业务提供不同的服务等等。

这些系统的目的都是让计算机来进行复杂繁琐的计算工作,来替代人力的手工劳动,提高工作效率和质量。这些不同的系统往往是在不同的时期建设起来的,运行在不同的平台上;也许是由不同厂商开发,使用了各种不同的技术和标准。

如果举例说国内一著名的IT公司(名字隐去),内部共有60多个业务系统,这些系统包括两个不同版本的SAP的ERP系统,12个不同类型和版本的数据库系统,8个不同类型和版本的操作系统,以及使用了3种不同的防火墙技术,还有数十种互相不能兼容的协议和标准,你相信吗?不要怀疑,这种情况其实非常普遍。每一个应用系统在运行了数年以后,都会成为不可替换的企业IT架构的一部分,如下图所示

随着企业的发展,业务系统的数量在不断的增加,老的系统却不能轻易的替换,这会带来很多的开销。其一是管理上的开销,需要维护的系统越来越多。很多系统的数据是相互冗余和重复的,数据的不一致性会给管理工作带来很大的压力。业务和业务之间的相关性也越来越大,例如公司的计费系统和财务系统,财务系统和人事系统之间都不可避免的有着密切的关系。

为了降低管理的消耗,最大限度的重用已有投资的系统,很多企业都在进行着企业应用集成(EAI)。企业应用集成可以在不同层面上进行:例如在数据存储层面上的“数据大集中”,在传输层面上的“通用数据交换平台”,在应用层面上的“业务流程整合”,和用户界面上的“通用企业门户”等等。事实上,还用一个层面上的集成变得越来越重要,那就是“身份认证”的整合,也就是“单点登录”。

通常来说,每个单独的系统都会有自己的安全体系和身份认证系统。整合以前,进入每个系统都需要进行登录,这样的局面不仅给管理上带来了很大的困难,在安全方面也埋下了重大的隐患。下面是一些著名的调查公司显示的统计数据:

另外,使用“单点登录”还是SOA时代的需求之一。在面向服务的架构中,服务和服务之间,程序和程序之间的通讯大量存在,服务之间的安全认证是SOA应用的难点之一,应此建立“单点登录”的系统体系能够大大简化SOA的安全问题,提高服务之间的合作效率。

2、单点登陆的技术实现机制

单点登录的机制其实是比较简单的,用一个现实中的例子做比较。颐和园是北京著名的旅游景点,在颐和园内部有许多独立的景点,例如“苏州街”、“佛香阁”和“德和园”,都可以在各个景点门口单独买票。很多游客需要游玩所有的景点,这种买票方式很不方便,需要在每个景点门口排队买票,钱包拿进拿出的,容易丢失,很不安全。于是绝大多数游客选择在大门口买一张通票(也叫套票),就可以玩遍所有的景点而不需要重新再买票。他们只需要在每个景点门口出示一下刚才买的套票就能够被允许进入每个独立的景点

单点登录的机制也一样,如下图所示,当用户第一次访问应用系统1的时候,因为还没有登录,会被引导到认证系统中进行登录(1);根据用户提供的登录信息,认证系统进行身份效验,如果通过效验,应该返回给用户一个认证的凭据--ticket(2);用户再访问别的应用的时候(3,5)就会将这个ticket带上,作为自己认证的凭据,应用系统接受到请求之后会把ticket送到认证系统进行效验,检查ticket的合法性(4,6)。如果通过效验,用户就可以在不用再次登录的情况下访问应用系统2和应用系统3了。

从上面的视图可以看出,要实现SSO,需要以下主要的功能:

所有应用系统共享一个身份认证系统。

统一的认证系统是SSO的前提之一。认证系统的主要功能是将用户的登录信息和用户信息库相比较,对用户进行登录认证;认证成功后,认证系统应该生成统一的认证标志(ticket),返还给用户。另外,认证系统还应该对ticket进行效验,判断其有效性。

所有应用系统能够识别和提取ticket信息

要实现SSO的功能,让用户只登录一次,就必须让应用系统能够识别已经登录过的用户。应用系统应该能对ticket进行识别和提取,通过与认证系统的通讯,能自动判断当前用户是否登录过,从而完成单点登录的功能。

常见的方式有:

使用redis之类的实现session共享使用jwt实现使用CAS实现…

二、CAS实现单点登录的原理

CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点:

开源的企业级单点登录解决方案。CAS Server 为需要独立部署的 Web 应用。CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。

从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。下图是 CAS 最基本的协议过程:

从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server

SSO单点登录访问流程主要有以下步骤:

访问服务:SSO客户端发送请求访问应用系统提供的服务资源。定向认证:SSO客户端会重定向用户请求到SSO服务器。用户认证:用户身份认证。发放票据:SSO服务器会产生一个随机的Service Ticket。验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。

三、CAS的安装和代码的实现

1、CAS Server的安装

war包地址:/download/booy123/12645805

下载地址:/apereo/cas-overlay-template

点击Download ZIP下载

下载解压后,将工程用开发工具打开,使用maven进行打包为war

使用开发工具打开并使用maven的package命令打包成war文件

将cas.war部署到tomcat的webapps目录下,后启动tomcat

在浏览器打开http://localhost:8080/cas 会出现登录页面,默认用户名:casuser,密码:Mellon

2、编写客户端

下载一个客户端示例代码:/cas-projects/cas-sample-java-webapp

1)、新建maven项目

新建一个Java web的maven项目

2)、导入依赖包

将刚下载的示例项目中的pom.xml中的依赖复制到自己项目中,如下

<dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1.1</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>org.jasig.cas.client</groupId><artifactId>cas-client-core</artifactId><version>3.4.1</version><exclusions><exclusion><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId></exclusion></exclusions></dependency>

3)、创建web.xml

将示例项目的web.xml中的内容复制到自己的项目的web.xml中,并将示例项目中的index.jsp和logout.jsp复制到自己的项目中,并修改web.xml中配置,将cas服务端修改成自己配置的tomcat地址,将客户端修改成自己的客户端的地址,例如本项目web.xml中的配置

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="/xml/ns/javaee"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/javaee/xml/ns/javaee/web-app_3_0.xsd"version="3.0"><!--SSOfilter--><filter><filter-name>CAS Single Sign Out Filter</filter-name><filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class><init-param><param-name>casServerUrlPrefix</param-name><!--cas-server的地址--><param-value>http://localhost:8080/cas</param-value></init-param></filter><listener><listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class></listener><!--认证filter--><filter><filter-name>CAS Authentication Filter</filter-name><!--<filter-class>org.jasig.cas.client.authentication.Saml11AuthenticationFilter</filter-class>--><filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class><init-param><param-name>casServerLoginUrl</param-name><!--cas-server登录地址,未登录会跳转到此处--><param-value>http://localhost:8080/cas/login</param-value></init-param><init-param><param-name>serverName</param-name><!--登录成功后跳转当前工程--><param-value>http://localhost:8080/casclient</param-value></init-param></filter><!--验证filter--><filter><filter-name>CAS Validation Filter</filter-name><!--<filter-class>org.jasig.cas.client.validation.Saml11TicketValidationFilter</filter-class>--><filter-class>org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter</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:8080/casclient</param-value></init-param><init-param><param-name>redirectAfterValidation</param-name><param-value>true</param-value></init-param><init-param><param-name>useSession</param-name><param-value>true</param-value></init-param><!--<init-param><param-name>acceptAnyProxy</param-name><param-value>true</param-value></init-param><init-param><param-name>proxyReceptorUrl</param-name><param-value>/sample/proxyUrl</param-value></init-param><init-param><param-name>proxyCallbackUrl</param-name><param-value>:9443/sample/proxyUrl</param-value></init-param>--><init-param><param-name>authn_method</param-name><param-value>mfa-duo</param-value></init-param></filter><filter><filter-name>CAS HttpServletRequest Wrapper Filter</filter-name><filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class></filter><filter-mapping><filter-name>CAS Single Sign Out Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter-mapping><filter-name>CAS Validation Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter-mapping><filter-name>CAS Authentication Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter-mapping><filter-name>CAS HttpServletRequest Wrapper Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list></web-app>

启动项目,运行项目的首页http://localhost:8080/casclient,会出现以下问题

未配置https出现的问题

出现此问题的原因主要是CAS默认支持的服务器和客户端必须是https协议的,但是我们刚写的项目中默认是http协议,此处有两种办法解决:

1:将刚刚的项目配置成https。

2:修改服务端配置,让http也可以支持。此处为了简单起见直接采用第二种方式。实际生产环境中可以采取第一种方式。

修改配置:在刚刚配置服务端的tomcat的webapps中找到cas项目,修改cas\WEB-INF\classes\services目录下的HTTPSandIMAPS-10000001.json文件,修改第三行。

#未修改前"serviceId" : "^(https|imaps)://.*",#修改为"serviceId" : "^(https|http|imaps)://.*",

修改cas\WEB-INF\classes目录下的application.properties文件,在最后加上如下内容

cas.tgc.secure=falsecas.serviceRegistry.initFromJson=true

重启服务器端后,再访问客户端的首页,会提示登录

说明客户端和服务器都配置成功,接下来需要验证客户端是否能够实现SSO效果

在tomcat的webapps中将客户端代码casclient复制一份,起名为casclient2,并修改web.xml中的casclient为casclient2

重启tomcat

在浏览器中打开:http://localhost:8080/casclient,并开启一个新的标签页打开另一个项目:http://localhost:8080/casclient2

发现都会出现上图的登录页面,在其中一个登录页面使用用户名casuser和密码Mellon进行登录,会跳转到项目的首页,然后在另一个标签中刷新,发现不用再次登录也会跳转到首页,说明单点登录效果成功。

3、使用springboot集成CAS客户端

接下来搭建springboot项目的客户端1

在新建的springboot项目的pom.xml添加如下依赖(匹配对应的版本)

<dependency><groupId>net.unicon.cas</groupId><artifactId>cas-client-autoconfig-support</artifactId><version>2.1.0-GA</version></dependency>

修改application.properties文件

server.port=8088#cas服务端的地址cas.server-url-prefix=http://localhost:8080/cas#cas服务端的登录地址cas.server-login-url=http://localhost:8080/cas/login#当前服务器的地址(客户端)cas.client-host-url=http://localhost:8088#Ticket校验器使用Cas30ProxyReceivingTicketValidationFiltercas.validation-type=cas3

修改Application类,添加注解@EnableCasClient

@EnableCasClient@SpringBootApplicationpublic class CasbootdemoApplication {public static void main(String[] args) {SpringApplication.run(CasbootdemoApplication.class, args);}}

创建一个测试类

@RestControllerpublic class CasController {@RequestMapping("/")public String index(){return "<p>heollo cas <a href='/logout.html'>退出登录</a></p>";}@RequestMapping("/logout.html")public String logout(HttpSession httpSession){httpSession.invalidate();return "logout success!";}}

打开浏览器启动http://localhost:8088,也会出现登录页面,可以跟前面的客户端一起测试效果

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。