
1、准备CAS的PHP库和相关库文件
1)到CAS的网站下载文件phpcas-0.60-rc7.zip
2) 由于其用到了PEAR的DB库,需要到PEAR网站去下载。
下载文件PEAR-1.7.1.tgz和DB-1.7.13.tgz 也可在google上搜索。
当然不一定是我说的版本,但我给的是我试验成功的版本。
3) 用于使用到了SSL所以需要下载openssl。当然我是在windows环境下试验的,下载的是
其的windows版本。
4)安装openssl。
2、配置PHP环境
1)将phpcas-0.60-rc7.zip解压,我们选在了PHP环境的include目录。在其下建立cas将文件解压进去。
2)同理将PEAR-1.7.1.tgz和DB-1.7.13.tgz解压,也分别建立pear和db两个目录。
3)修改php环境的ini文件,一般是php.ini文件。将我们前两步骤建立的目录加入到include_path中。根据安装环境修改对应的unix或windows项。
4)由于phpcas用到了CURL(用于连接ssl)和DOMXML(用于处理CAS服务器返回的消息)两个组件,因此需要保证php解释环境需要有这两个扩展。需要做的就是修改ini文件将extentions节下的屏蔽符号去掉,然后就是检查PHP环境的extentions目录下是否有对应的.dll或.o文件。一般标准安装都会有。
3、测试CAS的php客户端
1)前面做完后,应该比较激动了,很想看看php程序到底能不能访问CAS呢。
2)在phpcas-0.60-rc7.zip中的docs/examples中有几个测试程序。当然我们先前解压的目录下也有。
3)我们只是看一下通了没有,因此拷贝example_simple.php文件到apache的htdocs下。具体根据你的web服务器配置。总之目的就是能通过浏览器访问example_simple.php。在用之前需要修改
example_simple.php文件,主要是要修改里面关于CAS服务器配置信息,修改代码中的phpCAS::client(...)这一句。整个方法意义如下:
phpCAS::client(CAS_VERSION_2_0,'服务地址',端口号,'cas的访问地址')
将自己的服务地址和端口号和cas的相对服务地址的url填如就可以了,例如:phpCAS::client(CAS_VERSION_2_0,'localhost',8443,'cas')表示可以通过localhost:8443/cas访问到CAS服务。
4)在浏览器里试验一下吧,没有意外的话会看到CAS的登录界面。这就表示配通了。
4、根据项目需要修改对应的PHP代码,加入对CAS的调用,将用户登录交给CAS我们只需处理对应的用户,在PHP程序中的权限问题了。对于旧有就有的PHP代码只需要用访问CAS服务换掉验证用户身份部分就可以了。
调用CAS关键性代码:
include_once('CAS.php')
//可以不用,用于调试,可以通过服务端的cas.log看到验证过程。
phpCAS::setDebug()
// 初始化phpcas
p hpCAS::client(CAS_VERSION_2_0,'服务地址',端口号,'cas的访问地址')
例如:phpCAS::client(CAS_VERSION_2_0,'localhost',8443,'cas')
// 不使用SSL服务校验
phpCAS::setNoCasServerValidation()
// 访问CAS的验证
phpCAS::forceAuthentication()
这时候就验证完毕了
获得用户名可以通过phpCAS::getUser()
//登出
if (isset($_REQUEST['logout'])) {
phpCAS::logout()
}
当然CAS除了它默认的登录界面和校验逻辑,还是允许自行定义的。
如何自定义登录界面,后续在谈。
转载仅供参考,版权属于原作者。祝你愉快,满意请采纳哦
CAS是CentralAuthenticationService的缩写,中央认证服务,一种独立开放指令协议。
CAS是 Yale 大学发起的一个开源项目,旨在为Web应用系统提供一种可靠的单点登录方法,CAS在2004年12月正式成为JA-SIG的一个项目。
特点
1、开源的企业级单点登录解决方案。
2、CASServer为需要独立部署的Web应用。
3、CASClient支持非常多的客户端(这里指单点登录系统中的各个Web应用),包括Java,.Net,PHP,Perl,Apache,uPortal,Ruby等。
原理和协议
从结构上看,CAS包含两个部分:CASServer和CASClient。CASServer需要独立部署,主要负责对用户的认证工作;
CASClient负责处理对客户端受保护资源的访问请求,需要登录时,重定向到CASServer。图是CAS最基本的协议过程:
CASClient与受保护的客户端应用部署在一起,以Filter方式保护受保护的资源。对于访问受保护资源的每个Web请求,CASClient会分析该请求的Http请求中是否包含ServiceTicket,
如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的CASServer登录地址,并传递Service(也就是要访问的目的资源地址),以便登录成功过后转回该地址。
用户在第3步中输入认证信息,如果登录成功,CASServer随机产生一个相当长度、唯一、不可伪造的ServiceTicket,并缓存以待将来验证,
之后系统自动重定向到Service所在地址,并为客户端浏览器设置一个TicketGrantedCookie(TGC),
CASClient在拿到Service和新产生的Ticket过后,在第5,6步中与CASServer进行身份核实,以确保ServiceTicket的合法性。
在该协议中,所有与CAS的交互均采用SSL协议,确保,ST和TGC的安全性。协议工作过程中会有2次重定向的过程,但是CASClient与CASServer之间进行Ticket验证的过程对于用户是透明的。
另外,CAS协议中还提供了Proxy(代理)模式,以适应更加高级、复杂的应用场景,具体介绍可以参考CAS官方网站上的相关文档。
扩展资料
使用CAS在Tomcat中实现单点登录中部署客户端应用
单点登录的目的是为了让多个相关联的应用使用相同的登录过程,本文在讲解过程中构造2个简单的应用,分别以casTest1和casTest2来作为示例,它们均只有一个页面,显示欢迎信息和当前登录用户名。
这2个应用使用同一套登录信息,并且只有登录过的用户才能访问,通过本文的配置,实现单点登录,即只需登录一次就可以访问这两个应用。
与CASServer建立信任关系
假设CASServer单独部署在一台机器A,而客户端应用部署在机器B上,由于客户端应用与CASServer的通信采用SSL,因此,需要在A与B的JRE之间建立信任关系。
首先与A机器一样,要生成B机器上的证书,配置Tomcat的SSL协议。
其次,下载http://blogs.sun.com/andreas/entry/no_more_unable_to_find 的InstallCert.java,运行“javaInstallCertcompA:8443”命令,
并且在接下来出现的询问中输入1。
这样,就将A添加到了B的truststore中。如果多个客户端应用分别部署在不同机器上,那么每个机器都需要与CASServer所在机器建立信任关系。
配置CASFilter
准备好应用casTest1和casTest2过后,分别部署在B和C机器上,由于casTest1和casTest2,B和C完全等同,我们以casTest1在B机器上的配置做介绍,
假设A和B的域名分别为domainA和domainB。
将cas-client-java-2.1.1.zip改名为cas-client-java-2.1.1.jar并拷贝到casTest1/WEB-INF/lib目录下,修改web.xml文件,添加CASFilter,如清单10所示:
清单10.添加CASFilter
<web-app> ... <filter><filter-name>CASFilter</filter-name>
<filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class><init-param>
<param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name><param-value>https://domainA:8443/cas/login</param-value>
</init-param><init-param>
<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
<param-value>https://domainA:8443/cas/serviceValidate</param-value></init-param>
<init-param><param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
<param-value>domainB:8080</param-value></init-param>
</filter><filter-mapping>
<filter-name>CASFilter</filter-name>
<url-pattern>/protected-pattern/*</url-pattern></filter-mapping>
...</web-app>
对于所有访问满足casTest1/protected-pattern/路径的资源时,都要求到CASServer登录,如果需要整个casTest1均受保护,可以将url-pattern指定为“/*”。
从清单10可以看到,我们可以为CASFilter指定一些参数,并且有些是必须的,表格1 和表格2 中分别是必需和可选的参数:
表格1.CASFilter必需的参数
表格2.CASFilter可选参数
传递登录用户名
CAS在登录成功过后,会给浏览器回传Cookie,设置新的到的ServiceTicket。但客户端应用拥有各自的Session,我们要怎么在各个应用中获取当前登录用户的用户名呢?
CASClient的Filter已经做好了处理,在登录成功后,就可以直接从Session的属性中获取,如清单11所示:
清单11.在Java中通过Session获取登录用户名
1 //以下两者都可以
2 session.getAttribute(CASFilter.CAS_FILTER_USER)
3 session.getAttribute("edu.yale.its.tp.cas.client.filter.user")
在JSTL中获取用户名的方法如清单12所示:
清单12.通过JSTL获取登录用户名
1 <c:outvalue="${sessionScope[CAS:'edu.yale.its.tp.cas.client.filter.user']}"/>
另外,CAS提供了一个CASFilterRequestWrapper类,该类继承自HttpServletRequestWrapper,主要是重写了getRemoteUser()方法,
只要在前面配置CASFilter的时候为其设置“edu.yale.its.tp.cas.client.filter.wrapRequest”参数为true,就可以通过getRemoteUser()方法来获取登录用户名,具体方法如清单13所示:
清单13.通过CASFilterRequestWrapper获取登录用户名
1 CASFilterRequestWrapper reqWrapper=newCASFilterRequestWrapper(request)2 out.println("Thelogonuser:"+reqWrapper.getRemoteUser())
参考资料来源:百度百科-CAS
参考资料来源:IBM中国-使用CAS在Tomcat中实现单点登录
真的如老话所说,“没有笨的人,只有懒得人”。前段时间时间需要和其他项目做cas集成,于是乎在网上找了几篇教程看了一下,好了,很简单,学会了,开搞(自以为研究明白)。集成完事了,登录成功了,自以为这就过去了。然而,没过几天就出bug了,这下惨了,当初没有好好学出了问题都不知道咋解决。无奈,只得静下心来好好学习一番(当初太懒付出的代价)。原理其实很简单的,只要耐下心来好好研究终会搞懂的。
先看下图
那么是如何验证用户是否登录过呢?
如果session中包含“ const_cas_assertion ”属性,说明已经登录,跳过此过滤器执行配置的其他过滤器;
如果ticket参数不为空(可能是登陆后跳转回来的),跳过此过滤器,执行TicketValidationFilter 验证ticket;
如果前两个条件都不满足,重定向到cas服务端,返回登录页面进行登录 *** 作。
Cookie中的CASTGC:向cookie中添加该值的目的是当下次访问 www.cas.server.com 时,浏览器将Cookie中的TGC携带到服务器,服务器根据这个TGC,查找与之对应的TGT。从而判断用户是否登录过了,是否需要展示登录页面。TGT与TGC的关系就像SESSION与Cookie中SESSIONID的关系。
TGT:Ticket Granted Ticket(俗称大令牌,或者说票根,他可以签发ST)。
TGC:Ticket Granted Cookie(cookie中的value),存在Cookie中,根据他可以找到TGT。
ST:Service Ticket (小令牌),是TGT生成的,默认是用一次就生效了。也就是上面的ticket值。
为了加深理解,也为了以后作参考,整理记录。另外,还要说一句,不要偷懒,多动手多动脑!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)