cas单点登录如何实现一次登陆处处登陆,springboot cas单点登录
单点登录(SSO)是企业业务集成(SSO)的流行解决方案之一。
在多个应用系统中,用户只需要登录一次,就可以访问所有相互信任的应用系统。CAS(中央认证
Service)是一个很好的Web应用单点登录框架。本文介绍了Tomcat中CAS的原理、协议、配置和使用。
对认识CAS轻量级单点登录解决方案的初学者读者有一定的指导作用。
CAS简介
CAS是耶鲁大学发起的开源项目,旨在为Web应用系统提供可靠的单点登录方法。CAS于2004年12月正式成为JA-SIG项目。CAS具有以下特征:
开源企业单点登录解决方案。CAS是一个需要独立部署的Web应用程序。Cas支持大量的客户端(这里指单点登录系统中的每个Web应用),包括Java、NET、PHP、Perl、Apache、Uportal、Ruby等。
CAS原理和协议
在结构上,CAS由两部分组成:CAS服务器和CAS客户端。CAS服务器
需要独立部署,主要负责用户的认证;客户端负责处理对客户端受保护资源的访问请求,当需要登录时,它被重定向到CAS。
服务器.图1显示了CAS的基本协议流程:
图一。CAS客户端是CAS的基本协议,与受保护客户端应用一起部署,以过滤器的形式保护受保护资源。对于每个访问受保护资源的网站
请求,CAS客户端会分析这个请求的Http请求是否包含服务。
票,如果不是,则当前用户还没有登录,所以请求被重定向到指定的CAS服务器登录地址,服务被交付。
(即要访问的目的资源地址),以便成功登录后可以返回到该地址。用户在步骤3中输入身份验证信息,如果登录成功,CAS服务器
随机生成一个相当长的、唯一的、不可伪造的服务票,并缓存以备将来验证,之后系统会自动重定向到该服务。
地址,并为客户端浏览器设置票证授予Cookie(TGC)。CAS客户端获得服务
新生成的票据,在步骤5和步骤6中,与CAS服务器进行身份匹配,保证服务票据的合法性。
在该协议中,所有与ca的交互都采用SSL协议来保证ST和TGC的安全。协议的工作过程中会有两次重定向,但是CAS客户端和CAS服务器之间的票证验证过程对用户是透明的。
此外,CAS协议还提供了代理模式,以适应更高级、更复杂的应用场景。详情请参考中科院官网相关文件。
准备工作/即将开始工作
本文中的例子以tomcat5.5为例进行说明。下载地址:
http://tomcat.apache.org/download-55.cgi
从CAS官方网站下载CAS服务器和客户端,网址为:
http://www . ja-SIG . org/downloads/cas/cas-server-3 . 1 . 1-release . zip
http://www . ja-SIG . org/downloads/cas-clients/cas-client-Java-2 . 1 . 1 . zip
部署CAS服务器
CAS是一组基于Java实现的服务,它作为Java Web应用程序单独部署在与相同的网络中
2.3兼容servlet的Web服务器。此外,由于客户端与CAS服务器之间的交互采用Https协议,因此部署了Https协议。
CAS的服务器也需要支持SSL协议。当SSL配置成功时,CAS服务器将被用作一个常见的Web应用程序。
部署在服务器上可以正常工作。但是,在实际使用之前,有必要扩展用于认证用户的接口。
在Tomcat上部署完整的CAS服务器主要遵循以下步骤:
将Tomcat配置为使用Https协议
如果Tomcat支持Https,主要任务就是配置SSL协议。其配置过程和方法请参考Tomcat的相关文档。但是,在生成证书的过程中,会有需要使用主机名的地方。CAS建议使用机器名或域名代替IP地址。
部署CAS服务器
CAS是一个Web应用程序包。解锁之前下载的CAS Server-3.1.1-Release.zip,并将
cas-server-webapp-3.1.1.war拷贝到雄猫的开发目录,并更名为
cas.war。由于前面已配置好雄猫的安全超文本传输协议协议,可以重新启动
雄猫,然后访问:https://本地主机:8443/cas,如果能出现正常的国际体育仲裁法庭登录页面,则说明国际体育仲裁法庭
计算机网络服务器已经部署成功。
虽然国际体育仲裁法庭服务器已经部署成功,但这只是一个缺省的实现,在实际使用的时候,还需要根据实际概况做扩展和定制,最主要的是扩展认证(认证)接口和国际体育仲裁法庭服务器的界面。
扩展认证接口
国际体育仲裁法庭服务器负责完成对用户的认证工作,它会处理登录时的用户凭证(证书)
信息,用户名/密码对是最常见的凭证信息国际体育仲裁法庭服务器可能需要到数据库检索一条用户帐号信息,也可能在可扩展置标语言
文件中检索用户名/密码,还可能通过轻量级目录访问协议服务器获取等,在这种情况下,中科院
提供了一种灵活但统一的接口和实现分离的方式,实际使用中国际体育仲裁法庭采用哪种方式认证是与国际体育仲裁法庭
的基本协议分离开的,用户可以根据认证的接口去定制和扩展。
扩展认证处理程序
国际体育仲裁法庭提供扩展认证的核心是认证处理程序接口,该接口定义如清单一下:
清单1.认证处理程序定义
公共接口认证处理程序{
/**
*确定提供的凭据是否有效的方法。
* @param凭据要验证的凭据。
* @有效则返回没错,否则返回错误.
* @ throws AuthenticationException认证异常可以包含
*关于特定身份验证请求失败原因的详细信息。
*/
布尔身份验证(凭据凭据)引发认证异常
/**
*方法来检查处理程序是否知道如何处理凭据
*已提供。这可能是对凭证类的简单检查或其他什么
*更复杂的如扫描包含在
*凭证对象。
* @param凭据要检查的凭据。
* @如果处理程序支持凭据,则返回没错,否则返回错误.
*/
布尔支持(凭证凭证);
}
该接口定义了2个需要实现的方法,支持()方法用于检查所给的包含认证信息的证书是否受当前
认证处理程序支持;而认证()
方法则担当验证认证信息的任务,这也是需要扩展的主要方法,根据情况与存储合法认证信息的介质进行交互,返回布尔型类型的值,真的
表示验证通过,假的表示验证失败。
CAS3中还提供了对认证处理程序接口的一些抽象实现,比如,可能需要在执行认证()方法前后执行某些其他操作,那么可以让自己的认证类扩展自清单2中的抽象类:
清单2.AbstractPreAndPostProcessingAuthenticationHandler定义
公共抽象类AbstractPreAndPostProcessingAuthenticationHandler
实现认证处理程序{
受保护的日志Log=日志工厂。获取日志(此。getclass());
受保护的布尔预身份验证(最终凭据凭据){
返回真实的
}
受保护的布尔认证后(最终凭证凭证,
最终布尔验证){
返回已验证的;
}
公共最终布尔验证(最终凭证凭证)
引发认证异常{
如果(!预认证(凭证)){
返回错误的
}
最终布尔authenticated=doAuthentication(凭证);
返回认证后(凭证,已验证);
}
受保护的抽象布尔认证(最终凭据凭据)
引发认证异常
}
AbstractPreAndPostProcessingAuthenticationHandler类新定义了
预认证()方法和postAuthenticate()方法,而实际的认证工作交由
doAuthentication()方法来执行。因此,如果需要在认证前后执行一些额外的操作,可以分别扩展
预认证()和ppstAuthenticate()方法,而doAuthentication()取代
认证()成为了子类必须要实现的方法。
CAS/we b-INF/classes/newui _ views . properties ",并将所有值修改到相应的新页面。最后,更新“
Cas/WEB-INF/cas-servlet.xml”,并修改它,如清单9所示。
清单9。指定CAS页面
bean id=viewResolver
p:order=0
属性名=basenames
目录
value $ { cas . view resolver . basename }/value
value newUI_views /value
/列表
/属性
/bean
部署客户端应用程序
单点登录的目的是使多个相关的应用程序使用相同的登录过程。本文在讲解过程中构造了两个简单的应用,分别是castes 1和castes 1。
以测试2为例,它们都只有一个页面,显示欢迎消息和当前登录用户名。这个2
每个应用程序使用相同的登录信息集,只有登录的用户才能访问它。通过本文中的配置,实现了单点登录,即只需登录一次就可以访问这两个应用。
与CAS服务器建立信任关系
假设CAS服务器单独部署在机器A上,而客户端应用部署在机器b上,由于客户端应用和CAS服务器之间的通信是SSL,所以需要在A和b的JRE之间建立信任关系。
首先,像机器A一样,要在机器B上生成证书,需要配置Tomcat的SSL协议。其次,下载http://blogs.sun.com/andreas/entry/no_more_unable_to_find.
InstallCert.java,运行“java InstallCert compA:8443”命令,并输入下一个查询。
1。这样,a被添加到b的信任存储中。如果多个客户端应用程序部署在不同的机器上,每台机器都需要与CAS通信。
服务器所在的机器建立信任关系。
配置CAS过滤器
准备好应用casTest1和casTest2后,分别部署在B机和C机上。因为casTest1和casTest2,B
c和c完全一样,我们介绍一下B机上casTest1的配置,假设A和B的域名分别是domainA和domainB。
将cas-client-java-2.1.1.zip重命名为cas-client-java-2.1.1.jar,并将其复制到目录castes 1/we b-INF/lib。修改web.xml文件并添加CAS过滤器,如清单10所示:
清单10。添加CAS过滤器
元素内
.
过滤器
过滤器名称CAS过滤器/过滤器名称
过滤器类edu . Yale . its . TP . cas . client . filter . cas filter/filter-class
初始化参数
param-name edu . Yale . its . TP . cas . client . filter . log in URL/param-name
param-value https://域名:8443/cas/login /param-value
/init-param
初始化参数
param-name edu . Yale . its . TP . cas . client . filter . validate URL/param-name
param-value https://域名:8443/cas/service validate/param-value
/init-param
初始化参数
param-name edu . Yale . its . TP . cas . client . filter . server name/param-name
参数值域b:8080/参数值
/init-param
/过滤器
过滤映射
过滤器名称CAS过滤器/过滤器名称
url模式/受保护模式/* /url模式
/filter-映射
.
/网络应用
edu . Yale . its . TP . cas . client . filter . validate URL
指定由CAS提供的服务票证或代理票证身份验证服务的URL
edu . Yale . its . TP . cas . client . filter . servername
指定客户端的域名和端口,是指客户端应用程序所在的机器,而不是CAS服务器所在的机器。必须至少指定此参数或serviceUrl中的一个。
edu . Yale . its . TP . cas . client . filter . service URL
当指定此参数时,它将覆盖serverName参数,并在成功登录后成为重定向的目标地址。
edu . Yale . its . TP . cas . client . filter . proxycallbackurl
当当前应用程序需要充当其他服务的代理时,用于获取代理授予票证的地址。
允许当前应用程序从代理获取代理票证。此参数接受由空格分隔的多个代理。
网址,但实际使用只需要一次成功。指定此参数时,需要将validateUrl修改为proxyValidate,而不是
服务验证
edu . Yale . its . TP . cas . client . filter . renew
如果指定为true,受保护的资源将要求用户在每次访问它时重新进行身份验证,而不管它以前是否通过了身份验证。
edu . Yale . its . TP . cas . client . filter . wrap request
如果指定为没错,那么CASFilter将重新包装HttpRequest,并且使getRemoteUser()方法返回当前登录用户的用户名
传递登录用户名
国际体育仲裁法庭在登录成功过后,会给浏览器回传饼干,设置新的到的服务票。但客户端应用拥有各自的
会话,我们要怎么在各个应用中获取当前登录用户的用户名呢?国际体育仲裁法庭客户端的过滤器
已经做好了处理,在登录成功后,就可以直接从会议的属性中获取,如清单11 所示:
清单11.在爪哇中通过会议获取登录用户名
//以下两者都可以
session.getAttribute(CASFilter .CAS _ FILTER _ USER);
会话。获取属性( edu。耶鲁。它的。TP。中科院。客户。过滤器。用户’);
c:out value= $ {会话范围[CAS: edu。耶鲁。它的。TP。中科院。客户。过滤器。用户“]}”/
另外,中科院提供了一个CASFilterRequestWrapper
类,该类继承自HttpServletRequestWrapper,主要是重写了getRemoteUser()方法,只要在前面配置
CASFilter的时候为其设置“edu。耶鲁。它的。TP。中科院。客户。过滤器。包装请求"参数为
没错,就可以通过getRemoteUser()方法来获取登录用户名,具体方法如清单13 所示:
清单13.通过CASFilterRequestWrapper获取登录用户名
CASFilterRequestWrapper请求包装器=新CASFilterRequestWrapper(请求);
out.println(登录用户:请求包装。getremoteuser());
效果
在casTest1和casTest2中,都有一个简单小型应用程序作为欢迎页面WelcomPage,且该页面必须登录过后才能访问,页面代码如清单14 所示:
清单14.欢迎页页面代码
公共类欢迎页扩展HttpServlet {
公共void doGet(HttpServletRequest请求,HttpServletResponse响应)
抛出IOException,ServletException
{
回应。设置内容类型(“文本/html”);
PrintWriter out=响应。getwriter();
out.println( html
out.println( head
out.println(标题欢迎使用casTest2示例系统!/标题
out.println( /head
out.println( body
out.println( h1欢迎使用casTest1示例系统!/h1
CASFilterRequestWrapper请求包装器=新CASFilterRequestWrapper(请求);
out.println( p登录用户: reqWrapper.getRemoteUser() /p
http会话session=请求。getsession();
out.println( p登录用户:
session.getAttribute(CASFilter .CAS_FILTER_USER) /p
out.println( p登录用户:
会话。获取属性( edu。耶鲁。它的。TP。中科院。客户。过滤器。用户)/p
out.println( /body
out.println( /html
}
}
结束语
本文介绍了国际体育仲裁法庭单点登录解决方案的原理,并结合实例讲解了在雄猫中使用国际体育仲裁法庭的配置、部署方法以及效果100 .国际体育仲裁法庭是作为开源单点登录解决方案的一个不错选择,更多的使用细节可以参考国际体育仲裁法庭官方网站。
参考资料
有关国际体育仲裁法庭方面的信息,请参考国际体育仲裁法庭官方网站。
浏览贾-西格社区,与社区分享爪哇技术。
转自:IBM开发者社区
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。