配色: 字号:
cas单点登录
2016-10-18 | 阅:  转:  |  分享 
  
单点登录单点登录概述单点登录简介概述单点登录SSO(SingleSign-On)是一种身份认证机制。单点登录是就是在一个多系统共存的
环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。单点登录在大型网站里使用得非常频繁
,单点登录具有以下几处优点:1,提高用户的效率。用户不再被多次登录困扰,也不需要记住多个ID和密码。另外,用户忘记密码并求助于
支持人员的情况也会减少。2,提高开发人员的效率。SSO为开发人员提供了一个通用的身份验证框架。3,简化管理。如果应用程序加入了
单点登录协议,管理用户帐号的负担就会减轻。应用场景单点登录主要是解决在已有业务系统的基础上,将业务系统的登录认证工作抽取出来单独部
署,实现用户身份的统一认证,简化各业务系统登录认证的相关流程,降低企业的运营成本,提高用户的工作效率。cas单点登录简介概述CAS
(CentralAuthenticationService)是开源的企业级单点登录解决方案,旨在为web应用系统提供一种可靠的
单点登录方法。由耶鲁大学发起的一个开源项目,应用广泛,具有独立于平台的特点,易于理解,支持代理功能。CAS基于Java实现,易于扩
展,可以自己定制认证方式;集成也相对简单,通过Filter的方式保护受限的资源。Cas使用https协议进行通信,对传输的数据进行
加密操作,cas分为cas-client客户端与cas-server服务端,cas-server服务端需要单独部署,cas-cli
ent与子系统进行集成部署,Cas单点登录采用票据验证的方式,通过客户端与服务端双向认证,实现单点登录。开发人员只需在业务系统进行
简单的参数配置工作,不需要修改业务系统核心源码即可使用CAS提供的单点登录机制,CAS官方提供了稳定版本的单点登录服务端的实现及C
AS-SERVER.war,部署简单,Cas官方对简单的登录校验提供了良好的支持,例如简单的Md5密码加密校验等,开发人员可以通
过配置cas-server相关参数即可提供相应的校验支持,对于较为负杂的登录校验,cas官方也提供了具体的api接口,开发人员可以
根据api接口,定制系统的登录校验机制,可以灵活的实现相关的登录认证工作。Cas优势Cas单点登录简单易用,部署简单,cas具
有以下几处优点:Cas采用https协议,对传输的数据进行加密,保证了通信安全,杜绝了用户信息的泄露。CasClient支持非
常多的客户端(这里指单点登录系统中的各个WEB系统应用),包括Java,.Net,PHP,Perl,Apache,uP
ortal,Ruby等,casclient针对不同语言的客户端都提供了api接口,开发人员可以利用这些接口,解决不同语言的w
eb应用单点登录的验证工作。Cas支持代理功能。例如门户系统需要从其他业务系统中获取数据,可以使用cas的代理功能获取数据。Ca
s支持ldap协议。Cas可以集成当前系统已有的ldap服务,实现基于ldap的登录认证。Cas支持oauth协议。Cas服务
器可以集成oauth服务器,进行oauth协议的登录授权认证。Cas支持ehache,memchache等缓存框架,可以搭建相
应的服务集群,实现验证信息共享,可以配置相应的负载均衡服务,实现cas服务的高可用。Cas的优点将会在第二部分详细介绍,若是对某
一部分感兴趣可以具体浏览本文的第二部分。Cas要点安全性Cas客户端与服务器端通信采用Https协议来保证数据传输的安全性,Htt
ps使用SSL协议,SSL协议负责在传输层进行数据加密操作,保证了用户的密码的安全性,即使被黑客截获,也很难破解用户的密码。Cas
认证协议也保证了认证票据的安全性,相关票据都被设置了生命周期,只有在生命周期内,这些票据的验证才是有效的,超出生命周期系统会提示用
户重新验证。cas单点登录验证的几个重要概念:TGC:TGC是cas服务端为当前进行登录认证生成的验证票据,具有唯一性,标识当
前登录的用户。ST:ST是web应用客户端向cas服务端进行验证当前用户是否已经完成登录认证工作的认证票据(用户在cas服务端完
成登录认证操作,但web客户端并不知道用户已经完成登录,客户端需要进行验证),若验证通过,则允许当前应用将用户信息加入到当前web
应用的session中,并访问相应的资源。TGC票据是由cas-server通过SSL方式发送给终端用户,因此,要截取TGC
难度非常大,从而确保CAS登录认证过程中的安全性。TGC面临的风险主要并非传输窃取。比如你登陆了之后,没有Logout
,离开了电脑,别人就可以打开你的浏览器,直接访问你授权访问的应用,因此要合理的设置TGC的有效期限,通过spring的配置文件配置
即可。ST票据也是由cas-server通过SSL方式发送给终端用户,并且?ST只能使用一次,CAS协议规定,无论Ser
viceTicket验证是否成功,CASServer都会将服务端的缓存中清除该Ticket,从而可以确保一个ST被
使用一次。ST在一段时间内失效,可以配置相关参数进行设置,?ST是基于随机数生成的,确保了ST票据不会被伪造。CAS协议通过以上
措施保证了验证数据的安全性,相关安全参数的设置也比较简单,便于开发人员根据需求调整相应的策略。高可用Cas登录认证的流程是在cas
-server服务端进行的,若将cas-server部署在一台服务器上,则存在较大的宕机风险,cas-server服务一旦出现故障
,将导致所有的业务系统处于不可用状态,所以应对cas-server采取高可用的部署方案。实现cas的集群部署主要是解决cas-s
erver端票据的共享问题,集群之间实现了票据信息的相互共享,任意一台服务器宕机都不影响cas-server提供的登录认证服务,保
证了服务的高可用。Cas官方提供对ehcache,memcached等缓存框架的支持,cas-server项目中分别有cas-s
erver-integration-ehcache模块,cas-server-integration-memcached模块支持将
票据信息存入到对应的缓存框架中,用户可以根据自己项目的需求选择相应的缓存框架进行部署,并在cas-server中配置所选择的缓存框
架与缓存策略,实现票据信息的共享,部署cas-server集群服务。Cas-server端部署时可以采用常用的负载均衡的解决方案
,例如Haproxy+keepalived等实现对集群服务器的监控,动态分配服务器资源,对访问流量进行分流,提高用户体验。Ldap
服务与oauth服务支持Cas官方提供了cas-server-support-ldap模块来支持ldap协议认证,用户可以将现有
的ldap服务与cas-server集成,配置支持基于ldap协议的登录认证,cas与ldap的集成较为简单,Cas与ldap集成
有FastBindLdapAuthenticationHandler和BindLdapAuthenticationHandler这
两种接口,前者适用于CAS的验证登录名就直接是ldap当中uid的情况,后者一般用于需要验证的用户名是DN的其他的属性比如emai
l,而不是上面第一种处理器中的uid(当然uid属性同样适用),用户可根据需要选择相应的接口实现。用户将相关依赖的jar包加入到c
as-server中(可以直接通过maven配置,解决jar包依赖问题),在spring的配置文件中将默认的认证处理器更改为lda
p认证处理器,添加ladp服务器的配置参数便可以使用ldap协议完成登录认证。相关资料请参考http://www.micmiu.c
om/enterprise-app/sso/sso-cas-ldap-auth/CAS+LDAP实现单点登录认证。Cas官方提供
了cas-server-support-oauth模块来支持oauth协议认证,用户可以通过cas与oauth认证服务器的交互获
取第三方应用的用户信息(例如微信,微博,qq),完成登录认证工作,使用aouth协议进行校验需要使用cas-server4.0版本
,用户将cas-server-support-oauth.jar包加入到cas-server中,并在配置文件中配置oauth协议的
相关参数(oauth服务的回调url,clientId,client_secret),spring配置文件中配置oauth协议
的认证处理器。相关资料请参考http://www.voidcn.com/blog/u012410733/article/p-606
5309.htmlCASSSO4.0.x集成OAuth(微信登陆示例)。Cas与项目的集成采用cas实现单点登录机制较为简单
,只需要在要实现单点登录的业务系统之间进行一些配置工作,不需要修改子系统的源代码,只需将子系统中实现登录认证的源代码抽取到cas服
务端,实现登录认证。项目若采用cas实现单点登录,则需要在系统中加入cas-client-core.jar包,并在web.xml文
件中配置一些cas的参数即可,将系统实现的登录认证的工作集成到cas-server端,若系统的登录认证采用较为复杂的认证流程,可以
在cas-server端编写相应的认证处理器代码,实现自定义认证,系统若要与ldap,oauth协议进行集成,则在cas-serv
er端加入支持的jar包,编写针对各个协议的认证处理器,配置cas-server中关于认证的参数,实现针对各协议的认证。无论是新老
项目采用cas实现单点登录,只需要按照上述流程进行部署,将登录认账的代码与cas-server进行集成,客户端集成cas-clie
nt-core.jar包,并配置相关参数即可。Cas部署模式普通模式Cas普通模式是指业务系统在进行登录验证时独立的向cas-se
rver服务器进行认证校验,与其他业务系统没有交互。该模式的应用场景适合业务系统之间没有交互关系,业务系统独立的实现登录认证操作。
代理模式Cas代理模式适合用户访问app1,app1又依赖于app2获取一些信息(例如门户系统从其他业务系统中获取数据),此时ap
p1要代理app2向cas-server进行登录认证工作。该模式的应用的场景适合业务系统之间有交互关系,某个业务系统需要从其他业务
系统中获取数据,则需要配置成该模式。只需要将实现代理的业务系统配置成代理模式,若业务系统不需要从其他业务系统中获取数据,配置成普通
模式即可。Cas协议认证原理Cas协议普通模式认证基本术语1,TGT(TicketGrantingTicket)?TGT是CA
S为用户签发的登录票据(即一个java对象key-value键值对,key为TGC,value为当前登录的用户信息),拥有了TGT
,用户就可以证明自己在CAS-Server成功登录过(cassso中,登录验证的过程由CAS-Server提供),TGT封装了C
ookie值以及此Cookie(Cookie即为TGC)值对应的用户信。用户在CAS-Server认证成功后,生成cookie(T
GC),写入用户当前所使用的浏览器中,生成TGT对象,放入CAS-Server中的缓存中,TGT对象的ID就是cookie值,当h
ttp再次请求到来时,如果传过来的有cas生成的cookie(TGC),则cas一次cookie值为key查询缓存中有无TGT,如
果有的话,则说明用户之前登录过,如果没有,则用户需要重新进行登录。2,TGC(Ticket-grantingcookie)TG
C为经过cas-server验证通过,由cas-server生成用来存放用户身份认证凭证的cookie,在浏览器和cas-serv
er间通讯时使用,并且只能经过安全通道传输(采用https协议),是cas-Server用来明确用户身份的凭证。3,ST(Ser
viceticket)ST为服务票据(服务即为用户第一次所访问的应用的url地址),由cas-server发出,用户访问目标Se
rvice时,service发现用户没有ST,则要求用户去CAS-Server获取ST,用户向cas发出获取ST的请求,cas发现
用户有TGT,则签发一个ST,返回给用户。用户拿着ST访问Service,service拿ST去CAS验证,验证通过后,允许用户访
问资源。(ST获取的过程是在用户在cas-server完成登录验证后,cas-server会返回TGC与ST,呆服务向cas-se
rver验证ST通过后,ST便失效,自动销毁,ST只能使用一次)。认证流程?当用户第一次访问一个cas服务的客户web应用时(访
问URL:http://192.168.1.90/web01),部署在子系统应用的casauthenticationFilt
er,会截获此请求,生成service参数(即:https://xxxx/cas/login?service=xxx),然后re
direct到cas服务的login接口,认证成功后,cas服务器会生成认证cookie(TGC),写入浏览器,同时生成TGT
对象,缓存到cas服务器本地,cas服务器还会根据service参数生成ticket(即ST),ticket会保存到服务器,也会
加在URL后面,然后redirect回web应用,(URL://http://xxx/web01?ticket=ST-xcxxx
xx),这时客户端的AuthenticationFilter看到ticket参数后,会跳过,由其后面的TicketValidati
onFilter处理,TicketValidationFilter会利用httpclient工具访问cas服务的/serviceV
alidate接口,将ticket,service都传到此接口,由此接口验证ticket的有效性,TicketValidatioF
ilter如果得到验证成功的消息,就会把用户信息写入web应用的session中。至此,sso会话就建立起来,以后用户在同一浏览器
里访问web应用,AuthenticationFilter会在session中读取到用户信息,所以不会去cas认证。如果在浏览器里
访问别的web应用时,AuthenticationFilter在session中取不到用户的信息,会去cas的login接口认证,
但此时cas会读取到浏览器传来的cookie,所以cas不会要求用户去登录页面登录,只是会根据service参数生成ticket,
然后在和子系统应用做一个验证ticket的交互。Cas普通模式的认证流程,请参考下图。Cas协议代理模式认证基本术语1,PGT(
ProxyTicketGrantingTicket).代理模式中的TGTProxyService认证成功后,cas-se
rver会生成PGT,并将值返回给ProxyService。ProxyService拿到PGT后,就可以为TargetSer
vice做代理,为其申请PT.2,PGIOUT(ProxyTicketGrantingTicketIOU)。?PGTIOUT
是cas协议中定义的一种附加票据,它增强了传输,获取PGT的安全性。3,PT(ProxyTicket)。代理模式中的ST?PT是
用户访问TargetService的票据。用户经由ProxyService去cas-service获取到PT后,在访问Tar
getService,TargetService去CAS验证PT成功后,才允许用户访问。PGT的传输与获取过程:ProxyS
ervice调用cas的ServiceValidate接口验证ST成功后,CAS会首先访问pgtUrl指向的httpsurl,将
生成的PGT及PGTIOU传输给proxyservice,proxyservice会以pgtiou为key,pgt为value
,将其值存储在map中;然后cas会生成验证st成功的xml消息,返回给proxyservice,xml消息中含有pgtiout
,proxyservice收到xml消息后,会从中解析出pgtiou的值,然后以其为key,在map中找出pgt的值,赋值给代表
用户信息的Assertion对象的pgtId,同时在map中将其删除。4,TGT,ST,PGT,PT关系ST是由TGT签发。用户在
CAS上认证成功后,CAS生成TGT,用TGT签发一个ST,ST的ticketGrantingTicket属性值是TGT对象,然后
把ST的值redirect到客户应用。PGT是由ST签发。用户凭借ST去访问Proxyservice,Proxyservice
去CAS验证ST(同时传递PgtUrl参数给CAS),如果ST验证成功,则CAS用ST签发一个PGT,PGT对象里的ticketG
rantingTicket是签发ST的TGT对象。PT是由PGT签发。Proxyservice代理back-endservic
e去CAS获取PT的时候,CAS根据传来的pgt参数,获取到PGT对象,然后调用其grantServiceTicket方法,生成一
个PT对象。认证流程代理模式验证的流程前期与普通模式验证流程一致,proxyservice验证自身的登录认证服务依旧采用tgt,
st票据,普通模式进行验证,代理模式的流程在浏览器获得st后,浏览器向代理的客户端(cas-client)传递了st,客户端配置的
cas-client会向cas-server传递st与pgturl参数,cas-server在收到st与pgturl时,会验证st
,ProxyService调用cas的ServiceValidate接口验证ST成功后,CAS会首先访问pgtUrl指向的htt
psurl,将生成的PGT及PGTIOU传输给proxyservice,proxyservice会以pgtiou为key,p
gt为value,将其值存储在map中;然后cas会生成验证st成功的xml消息,返回给proxyservice,xml消息中含
有pgtiout,proxyservice收到xml消息后,会从中解析出pgtiou的值,然后以其为key,在map中找出pgt
的值,赋值给代表用户信息的Assertion对象的pgtId,同时在map中将其删除。此时在客户端变存储了PGT对象,当proxy
service要访问targetservice时,proxyservice会向cas-server传递pgt参数,cas-S
erver根据pgt对象生成pt对象,发送到Proxyservice,proxyservie会在访问的targetservi
ce的http地址中附加pt参数,targetservice在收到pt参数后,将pt参数发送到cas-service进行验证,验
证通过后,targetservice会响应proxyservice的请求,返回proxyservice请求的数据。Cas代
理认证流程较为复杂,具体应用请查看下文代理模式java源码示例。Cas代理模式的认证流程,请参考下图。Cas安装配置Cas配置流
程备注:本文采用cas4.0版本进行配置部署,cas3.5版本的配置会在以下章节中特别标注,可参考相应的配置。配置采用http协
议配置。采用https协议请查看附录。cas与jdk的版本对应与所需相关jar包请查看(二)环境准备篇,cas-client客户端
与cas-server服务端配置详情请查看(三)(四)(五)篇。配置cas-server服务端,在cas-server-webap
p中选择配置代理模式/普通模式,配置认证处理器,编写相关的自定义认证代码。配置cas-client客户端,在客户端业务系统配置ca
s-client-core.Jar与日志jar包,选择配置代理模式/普通模式,配置业务系统web.xml配置文件,添加cas过滤器
配置。环境准备Jdk1.6配置:客户端(即业务系统):cas-client-core-3.2.x.jarslf4j.jar
commons-logging-1.1.jarCas服务端:cas-server-webapp-3.5Jdk1.7配置:客
户端(即业务系统):cas-client-core-3.3.x.jarCas服务端:cas-server-webapp-4.0
slf4j.jarlog4j.jar域名设置:配置C:\Windows\System32\drivers\etc\hosts文
件,添加127.0.0.1sso.rocye.com,127.0.0.1app1.rocye.com,127.0.0.1
app2.rocye.comCas-server服务端配置自定义登陆认证处理器1.1环境准备与maven配置开发环境:
EclipseJdk1.7maven3.xPom.xml文件配置:cy>mysqlmysql-connector-javafactId>5.1.39下载cas-server-4.0源码,导
入eclipse中,在cas-server-core模块中编写自定义认证的代码.备注:本文示例的自定义认证代码,采用mysql数据
库,数据读取直接调用的jdbc的api没有使用mybatis,hibernate类似的持久层框架,若项目使用了这些框架可在mave
n中添加使用的jar包。cas-server-core中编写自定义认证处理器要继承cas-server-core提供的Abstr
actUsernamePasswordAuthenticationHandler,重写其认证方法authenticateUsern
amePasswordInternal().若系统提供了较为复杂的系统登录校验,可在cas-server-core编写相应的校验方
法,编写测试通过后,打包cas-server-core,将cas-server中的cas-server-core.jar包替换掉,
lib文件夹下添加相应的jdbc的jar包,在cas-server相应的spring配置文件中,将系统默认的认证处理器注释掉,配置
成自定义的认证处理器,相关配置步骤请查看下面的文档。packageorg.jasig.cas.customAuthenticat
ion.action;importjava.security.GeneralSecurityException;importj
avax.security.auth.login.FailedLoginException;importorg.jasig.ca
s.authentication.HandlerResult;importorg.jasig.cas.authenticatio
n.PreventedException;importorg.jasig.cas.authentication.Username
PasswordCredential;importorg.jasig.cas.authentication.handler.su
pport.AbstractUsernamePasswordAuthenticationHandler;importorg.ja
sig.cas.authentication.principal.SimplePrincipal;importorg.jasig
.cas.customAuthentication.service.UserAuthenticationService;publi
cclassCustomUsersAuthenticationHandlerextendsAbstractUsername
PasswordAuthenticationHandler{privateUserAuthenticationServiceu
as;publicCustomUsersAuthenticationHandler(){uas=newUserAuthent
icationService();}@OverrideprotectedHandlerResultauthenticateUs
ernamePasswordInternal(UsernamePasswordCredentialtransformedCred
ential)throwsGeneralSecurityException,PreventedException{//获取
form表单登录的username,passwordStringusername=transformedCredential.g
etUsername();Stringpassword=transformedCredential.getPassword();
//在本方法中调用登录认证检查的代码booleanflag=uas.UserAuthentication(username,p
assword);if(!flag){thrownewFailedLoginException();}returncreat
eHandlerResult(transformedCredential,newSimplePrincipal(username
),null);}}1.2自定义认证处理器示例Spring配置文件示例配置:备注:修改cas-server中web-inf/de
ployerConfigContext.xml文件,找到id为primaryAuthenticationHandler的bean
,将原先的bean注释掉,把这个修改成我们新增的类。primaryAuthenticationHandler"class="org.jasig.cas.customAuthenti
cation.action.CustomUsersAuthenticationHandler">自定义返回的用户信
息编写自定义用户信息类备注:cas-server-core中默认使用StubPersonAttributeDao类获取用户信息的数
据,编写自定义返回用户信息类的思路为继承StubPersonAttributeDao类,重写getPerson方法。编写后,重新将
cas-server-core包,编译打成jar包,替换掉cas-server-webapp中原先的jar包。publiccla
ssCustomBackUserInfoextendsStubPersonAttributeDao{//加入自定义获取用户
信息的service类privateUserAuthenticationServiceuas;publicCustomBac
kUserInfo(){uas=newUserAuthenticationService();}//重写获得用户信息,uid为登
录表单的username值@OverridepublicIPersonAttributesgetPerson(Stringu
id){Map>attributes=newHashMapist>();Useruser=uas.getUserByUserName(uid);attributes.pu
t("userId",Collections.singletonList((Object)user.getId()));attr
ibutes.put("userName",Collections.singletonList((Object)user.getN
ame()));attributes.put("password",Collections.singletonList((Obj
ect)user.getPassword()));attributes.put("nickName",Collections.s
ingletonList((Object)user.getNickName()));returnnewAttributeNa
medPersonImpl(attributes);}}2)修改cas-server/WEB-INF/view/jsp/prot
ocol/2.0/casServiceValidationFailure.jsps:cas=''http://www.yale.edu/tp/cas''>s:user>${fn:escapeXml(assertion.primaryAuthentication.principal.i
d)}inedAuthentications[fn:length(assertion.chainedAuthentications)-1
].principal.attributes)>0}">ttr"items="${assertion.chainedAuthentications[fn:length(assertio
n.chainedAuthentications)-1].principal.attributes}">capeXml(attr.key)}>${fn:escapeXml(attr.value)}l(attr.key)}>
"${notemptypgtIou}">${pgtIou}oxyGrantingTicket>nedAuthentications)>1}">tems="${assertion.chainedAuthentications}"varStatus="loopStatus"
begin="0"end="${fn:length(assertion.chainedAuthentications)-2}"
step="1">${fn:escapeXml(proxy.principal.id)}oxy>
ss>3)修改cas/web-inf/deployerConfigContext.x
ml,找到beanid=”attributeRepository”的类,替换成自定义的用户信息类。ibuteRepository"class="org.jasig.cas.customAuthentication.action
.CustomBackUserInfo"/>4)客户端接收服务端传来的数据出现中文乱码,在客户端web.xml中添加配置红色标
注。CASValidationFilterclass>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketVa
lidationFiltercasServerUrl
Prefix
http://sso.rocye.com:8080/casram-value>
serverNamename>http://app1.rocye.com:18080-param>proxyCallbackUrlm-value>http://app1.rocye.com:18080/castest/proxyCallbackvalue>proxyReceptorUrlm-name>/proxyCallbackencoding>UTF-8
5)客户端接
收用户信息。<%request.setCharacterEncoding("UTF-8");AttributePrinci
palprincipal=(AttributePrincipal)request.getUserPrincipal();
Mapattributes=principal.getAttributes();StringuserId=(String
)attributes.get("userId");StringuserName=(String)attributes.
get("userName");Stringpassword=(String)attributes.get("passw
ord");StringnickName=(String)attributes.get("nickName");%>

  • userid:<%=userId%>
  • username:<%=userName%>
  • i>password:<%=password%>
  • nickName:<%=nickName%>
  • <
    /ul>cas-server服务端代理模式配置备注:cas默认支持普通模式(普通模式不需要陪着孩子),配置Cas-server服务
    端支持代理非常简单,修改web-info/deployerConfigContext.xml文件的相关参数。Cas-server-
    3.5.x版本配置.InMemoryServiceRegistryDaoImpl">ces">ervice">alue="HTTPandIMAP"/>sHTTP(S)andIMAP(S)protocols"/>lue="^(https?|imaps?)://."/>alue="10000001"/>>Cas-Server-4.0.x版本配置ist">p:id="0"p:name="HTTPandIMAP"p:description="AllowsHTTP(S)an
    dIMAP(S)protocols"p:serviceId="^(https?|imaps?)://."p:evalua
    tionOrder="10000001"p:allowedToProxy="true"/>Cas-client客户端配置备注:用
    户应在业务系统需求选择普通模式/代理模式进行配置部署Jar包与Maven配置<
    dependency>org.jasig.cas.clientc
    as-client-core
    3.3.3
    org.slf4jId>slf4j-api1.7.5ependency>log4jlog4j<
    version>1.2.17org.slf
    4j
    slf4j-log4j121.7.5<
    /version>
    普通模式客户端web.xml文件配置(若采用https协议,将下面的http头修改为h
    ttps),文本框内的内容可以直接拷贝,并修改红色字体标注的部分CASSingleSignOutFi
    lter
    org.jasig.cas.client.session.Si
    ngleSignOutFilter
    ter-name>CASSingleSignOutFilter/
    CASFilt
    er
    org.jasig.cas.client.authenticati
    on.AuthenticationFilter
    >casServerLoginUrlhttp://sso.rocye.com:8080/cas/loginparam-value>serverName
    http://app1.rocye.
    com:18080

    CASFilter/tern>
    >CASValidationFilters>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketVali
    dationFiltercasServerU
    rlPrefix
    http://sso.
    rocye.com:8080/cas
    aram-name>serverNameue>http://app1.rocye.com:18080ter>CASValidationFilter
    -name>/CASHtt
    pServletRequestWrapperFilter
    org
    .jasig.cas.client.util.HttpServletRequestWrapperFilterass>
    CASHttpServletReq
    uestWrapperFilter
    /
    CASAssertionThread
    LocalFilter
    org.jasig.cas.client.ut
    il.AssertionThreadLocalFilter
    pping>CASAssertionThreadLocalFilterme>/代理模式备注:代理模式
    配置是在普通模式配置的基础上加入代理模式的参数配置,只需要在代理客户端配置代理参数,被代理的客户端配置接受代理的参数,未使用cas
    代理的客户端配置成普通模式即可。org.j
    asig.cas.client.session.SingleSignOutHttpSessionListenerr-class>
    CASSingleSignOutFilte
    r
    org.jasig.cas.client.session.SingleS
    ignOutFilter

    CASSingleSignOutFilter
    /rn>
    CASFilter<
    filter-class>org.jasig.cas.client.authentication.AuthenticationFi
    ltercasServerLoginUrlam-name>http://sso.rocye.com:8080/cas/loginalue>serverName
    http://app2.rocye.com:28080m>
    CASFilterrl-pattern>/
    CASValidationFilter
    org.jasig.cas.cli
    ent.validation.Cas20ProxyReceivingTicketValidationFilterclass>代理客户端web.xml文件配置casServerUrlPrefix
    http://sso.rocye.com:8080/caslue>
    serverName<
    param-value>http://app1.rocye.com:18080>ram-name>proxyCallbackUrlhttp://app1.ro
    cye.com:18080/castest/proxyCallback
    --该参数被代理应用及castest2回调时使用-->proxyRecepto
    rUrl
    /proxyCallbackparam>
    CASValidationFilterer-name>/proxyCallback>CASValidationFilter<
    url-pattern>/
    ter-name>CASFilter
    /lter-mapping>CASHttpServletRequestWrapperF
    ilter
    org.jasig.cas.client.util.HttpSe
    rvletRequestWrapperFilter

    CASHttpServletRequestWrapperFilterrl-pattern>/

    CASAssertionThreadLocalFilter
    org.j
    asig.cas.client.util.AssertionThreadLocalFilter
    ilter>CASAssertionThreadLocalFilt
    er
    /
    -casend-->备注:validationfilter必须在authenticationfilter之前先被映射(先
    映射代理票据验证》普通票据验证》身份验证》其他过滤器)class>org.jasig.cas.client.session.SingleSignOutHttpSessionListen
    er
    CASSingleSign
    OutFilter
    org.jasig.cas.client.sessi
    on.SingleSignOutFilter
    lter-name>CASSingleSignOutFilter
    /<
    /url-pattern>CASFilterter-name>org.jasig.cas.client.authentication.Authen
    ticationFilter
    casServerLog
    inUrl
    http://sso.rocye.com:8080/cas/logi
    n
    serverNamearam-name>http://app2.rocye.com:28080<
    /init-param>
    CASFilterer-name>/被代理客户端web.x
    ml配置CASValidationFilterr-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicket
    ValidationFiltercasServerU
    rlPrefix
    http://sso.rocye.com:8080/casparam-value>
    serverNamem-name>http://app2.rocye.com:28080it-param>acceptAn
    yProxy
    true
    nit-param>redirectAfterValidationvalue>false
    ilter-name>CASValidationFilter/-pattern>CASHttpServletRequ
    estWrapperFilter
    org.jasig.cas.clien
    t.util.HttpServletRequestWrapperFilter
    lter-mapping>CASHttpServletRequestWrapperFilterilter-name>/
    CASAssertionThreadLocalFilterr-class>org.jasig.cas.client.util.AssertionThreadLocalFilterter-class>
    CASAssertionThre
    adLocalFilter
    /r-mapping>代理模式java源码示例备注:编写代理模式java源码时,代理客户端要生成PT
    票据,该票据的作用是代理客户端app1代理被代理客户端app2向cas-server服务器进行身份验证,app2身份验证通过后,便
    可响应app1的请求。具体api的调用请查看示例源码与相应的注释。App1代理客户端java源码示例:@Controllerpu
    blicclassTestCASProxy{@RequestMapping("/casProxyTest")publicM
    odelAndViewdoCASProxy()throwsException{//访问被代理应用castest2的http地
    址StringserviceUrl="http://app2.rocye.com:28080/castest2/protecte
    d";//cas-clientapi获取被代理应用castest2向cas-server进行验证时提供的代理验证票据PTA
    ssertionassertion=AssertionHolder.getAssertion();//pt票据的生成需要访问的H
    ttp地址StringproxyTicket=assertion.getPrincipal().getProxyTicketFo
    r(serviceUrl);//以下为向castest2被代理客户端发起http请求,并读取castest2所相应的数据URLu
    rl=newURL(serviceUrl+"?ticket="+proxyTicket);HttpURLConnectionc
    onn=null;conn=(HttpURLConnection)url.openConnection();conn.setDoO
    utput(true);OutputStreamWriterosw=newOutputStreamWriter(conn.ge
    tOutputStream(),"UTF-8");osw.write("name=casProxy");osw.close();S
    tringmessage=conn.getResponseMessage();Stringmsg=null;//200代表访问
    被代理客户端成功,从流中读取响应数据if(conn.getResponseCode()==200){InputStreamis=
    conn.getInputStream();//将输入流转换成字符串ByteArrayOutputStreambaos=new
    ByteArrayOutputStream();byte[]buffer=newbyte[1024];intlen=0;wh
    ile((len=is.read(buffer))!=-1){baos.write(buffer,0,len);}msg=ba
    os.toString();baos.close();is.close();}conn.disconnect();ModelAnd
    Viewma=newModelAndView();ma.addObject("msg",message+msg);ma.se
    tViewName("/index");returnma;}}App2被代理客户端java源码。packagecastest
    2.web;importjava.io.IOException;importjava.io.PrintWriter;impor
    tjavax.servlet.http.HttpServletRequest;importjavax.servlet.http
    .HttpServletResponse;importorg.springframework.stereotype.Contro
    ller;importorg.springframework.web.bind.annotation.RequestMappin
    g;@ControllerpublicclassTestController{@RequestMapping("/prote
    cted")publicvoidgetCasProxy(HttpServletRequestrequest,HttpServ
    letResponseresponse)throwsIOException{Stringname=request.getP
    arameter("name");System.out.println(name);PrintWriterout=respons
    e.getWriter();//返回响应数据out.print("casclientreceivemessage");out.
    flush();out.close();}}Cas-Server登录页样式设置Cas-server提供了默认的登录页,样式较为简单
    ,我们可以根据自身的需求修改cas-server提供的默认登录页面,添加自定义的css样式文件。涉及修改的cas-server-w
    ebapp文件(1)WEB-INF/view/jsp/default/ui/casLoginView.jsp(cas-serve
    r登录主页面)(2)/WEB-INF/view/jsp/default/ui/includes/top.jsp\bottom.
    jsp(cas-server默认引入的头部与底部样式文件)(3)/WEB-INF/classes/cas-theme-defa
    ult.properties(配置了cas-server页面使用的css样式文件与自定义js文件)(4)/WEB-INF/cla
    sses/default_views.properties(配置了cas-server默认使用的登录页面)(5)/WEB-IN
    F/cas.properties(该文件配置引用了cas-theme-default.properties与default_vi
    ews.properties)修改步骤把?cas\WEB-INF\view\jsp\default?下面的所有文件复制下,然后重命
    名为我们需要的名称,cas\WEB-INF\view\jsp\isoftstone。1.在cas.properties修改cas.
    viewResolver.basename值为isoftstone_view?,系统会自动会查找isoftstone_view.p
    roperties这个配置文件,并读取配置。图4-1cas.properties文件2.第1点中查找的isoftstone_v
    iew.properties是没有的,我们要自己新建,直接复制原来的default_views.properties就行了,重命名
    isoftstone_view.properties。3.但是isoftstone_view.properties中的地址前缀还
    是/WEB-INF/view/jsp/default/,我们全部替换把这些地址前缀替换成/WEB-INF/view/jsp/iso
    ftstone,并设置casLoginView.url=/WEB-INF/view/jsp/isoftstone/ui/casL
    oginView.jsp图4-2default_views.properties4.修改拷贝后的casLoginView.j
    sp页面。casLoginView.jsp不需要修改登录所需要的form表单,主要是form:form这标签里的东西不要修改。
    可在本页面加入相应的css样式文件,若单独编写css文件与js文件可以修改拷贝后的cas-theme-default.proper
    ties文件图4-3casLoginView.jsp5,cas-servere将登录界面中的jquery库是配置在cas\
    WEB-INF\view\jsp\default\ui\includes\bottom.jsp中的,可修改拷贝后的bottom.j
    sp页面自定义jquery的位置。附录Tomcats配置cas下载地址Casdemo项目使用3组tomcat分别部署app1
    ,app2,cas-server,需要修改tomcat的server.xml文件,避免端口冲突。-->0"protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="
    18443"/>"18443"/>Cas下载地址:下载CAS服务端地址:http://developer.jasig.org/cas/http:
    //developer.jasig.org/cas/下载CAS客户端地址:http://developer.jasig.org/c
    as-clients/http://developer.jasig.org/cas-clients/Cas源码下载地址:http
    s://github.com/apereo/cas/tree/4.0.xhttps://github.com/apereo/cas
    /tree/4.0.xCashttp协议配置备注:cas3.5版本与4.0版本通用。修改cas-server服务端WEB-I
    NF/deployerConfigContext.xml文件ntication.handler.support.HttpBasedServiceCredentialsAuthenticati
    onHandler"p:httpClient-ref="httpClient"p:requireSecure="fals
    e"/>修改cas-server服务端WEB-INF/spring-configuration/ticketGrantingTi
    cketCookieGenerator.xml文件enerator"class="org.jasig.cas.web.support.CookieRetrievingCook
    ieGenerator"p:cookieSecure="false"p:cookieMaxAge="-1"p:coo
    kieName="CASTGC"p:cookiePath="/cas"/>修改cas-server服务端WEB-INF
    \spring-configuration\warnCookieGenerator.xml文件ookieGenerator"class="org.jasig.cas.web.support.CookieRetrievi
    ngCookieGenerator"p:cookieSecure="false"p:cookieMaxAge="-1"
    p:cookieName="CASPRIVACY"p:cookiePath="/cas"/>(4)客户端web.xm
    l文件配置的cas过滤器映射地址采用http前缀。Cashttps协议配置备注:cas默认采用https协议,使用https协议
    不需要修改相关配置文件,在客户端web.xml文件中配置的cas过滤器采用https协议前缀。Cas-server服务端配置生成密
    钥文件备注:生成证书使用jdk的keytool命令。Cmd输入keytool-genkey-aliaswsria
    -keyalgRSA-storepasschangeit-keystored:/keys/wsria.key
    store命令参数解析genkey:生成密钥alias:此秘钥条目的别名wsria,可以任意取值,需要记住keyalg:
    秘钥采用的加密方式RSAstorepass:秘钥库文件的密码keystore:指定密匙存放的路径和秘钥名字wsria.keys
    tore备注:如果不加参数-keystore的话,密钥默认路径在C:/Users/用户名/.keystore然后回车根据提示输入
    依次下列各项名字与姓氏:localhost//此处输入域名,不可是ip地址其他选项的输入不做要求组织单位名称:城市或区域名
    称:省/市/自治区名:国家/地区代码:备注:上述信息也可直接在上面的命令中加入参数-dname,后跟这些信息-dname
    “CN=localhost,OU=localhost,O=localhost,L=北京,ST=北京,C=zh”注:完成会
    回车,会要求输入定义的别名条目的访问密码,直接回车,密码跟秘钥库一致,也可自行设置其他密码上述命令会①在d盘keys文件夹(已存在
    )下生成一个wsria.keystore的文件根据密钥生成证书文件。Cmd输入keytool-export-alias
    wsria-filed:/jdk1.7/bin/wsria.crt-keystored:/keys/wsria.
    keystore上述命令会将生成的密钥文件信息输出到d盘jdk1.7/bin目录下的wsria.crt证书文件中,此证书文件在
    客户端要用到将证书文件导入jdk的证书库cacerts中Cmd输入keytool-import-filed:/jdk1
    .7/bin/wsria.crt-keystored:/jdk1.7/jre/lib/security/cacerts
    -aliaswsriajava可以识别生成的证书了注:d:/jdk1.7/jre/lib/security/cacerts为
    java的证书库配置服务端tomcat配置tomcatserver.xml文件protocol="org.apache.coyote.http11.Http11Protocol"maxThreads="15
    0"SSLEnabled="true"scheme="https"secure="true"clientAuth="fal
    se"sslProtocol="TLS"/>打开注释并加入以下2属性keystoreFile="d:/keys/wsria
    .keystore"//此值为①中生成的密钥文件地址keystorePass="changeit"//此值为①命令中的sto
    repass密码服务器端测试服务端配置到此结束,将下载好的cas-server-webapp.war放置到配好的Tomcat的w
    ebapp目录下,并修改为cas.war启动Tomcat,并访问http://localhost:8443/cas将会出现JASIG的登录页面,默认登录用户名和密码一致即可通过验证。注:①url中的localhost即是生成秘钥时配置的域名若采用其他域名,例如:com.iaf.cas则url变成http://com.iaf.cas:8443/cas本机的话需要在hosts文件中加入127.0.0.1com.iaf.cas端口号8443改为443,则在访问url时候可以不加端口号客户端配置导入服务端生成的证书,将服务端生成的wsria.crt证书拷贝至客户端,并将证书信息导入到java的cacerts证书库中,命令参看服务端配置③步骤(同台机器可忽略此步骤,因为服务端已经导入了)keytool-import-filed:/jdk1.7/bin/wsria.crt-keystored:/jdk1.7/jre/lib/security/cacerts-aliaswsria服务端配置ticket过期(单点退出)(1)设置ticket过期时间与生命周期配置文件路径:WEB-INF/spring-configuration/ticketExpirationPolicies.xml默认配置:当用户在2个小时(7200秒)之内不动移动鼠标或者进行系统超过8个小时(28800秒),则TGTticket过期,需重新登录,可根据项目自行配置(2)配置清除ticket的定时任务当ticket过期后,需要在服务端删除此ticket,这样才能再次登录的时候实现重新登录,这是有quartz定时任务控制的配置文件路径:WEB-INF/spring-configuration/ticketRegistry.xml注:repeatInterval配置quartz定时清理TGT的间隔,单位:毫秒此定时任务负责检查tiket是否过期,过期则删除。cas-serverTGT过期策略配置cas-serverTGT过期时间。配置定时器定时清理TGT。合理配置ST的存活时间(ST只能使用一次,考虑网络延迟)。合理配置客户端session存活时间,session被清空,客户端要与服务端重新发起一次认证交互过程,若用户的TGT超时,用户则需要进行登录认证的操作。备注cas-server清理TGT的类为DefaultTicketRegisterClear,该类中清除TGT的方法中调用了logoutManager.Performe()方法,使得清除操作通知用户所有登录的业务子系统会受到cas-server发出的单点退出通知,在客户端执行单点登出操作,清除用户的session与TGC,用户在访问客户端时,casclient会检测到用户session中没有登录的数据,会将请求重定向至casserver中进行登录认证。(5)cas-client前台过滤器校验流程Authenticationfilter校验assertion(用户session中存储用户信息的对象)校验流程:Authenticationfilter校验用户session,session不为空,放行,assertion为Null,ticket(ST)不为空,则会由casxxxProxyTicketfilter校验ST,ST校验成功会返回包含用户信息的xml,casxxxProxyTicket会将xml的数据加入到用户session中,此时单点登录认证完成。cas安全问题cas数据传输的安全性完全依赖于https协议,通过SSL或TLS协议加密传输的数据。Https协议提供了对服务方的身份验证,浏览器会校验服务端发送过来的CA证书,验证CAS-Server是否有效,https协议会为每次会话生成临时密钥,保证每次通信数据的传输安全,第三方截获数据后无法破解,从而保证了cas票据的安全。CAS跨域问题Cas-server服务端生成的TGC票据是存储在cas-server域名对应的cookie中,解决了业务系统之间的跨域问题,当业务系统的过滤器检测到当前用户未登陆,会将请求重定向至cas-server,浏览器自动将cas-server域名对应的cookie发送到cas-server服务端,验证TGC。
献花(0)
+1
(本文系樱梦雪苹宝首藏)