|
cas单点登录 |
|
|
单点登录单点登录概述单点登录简介概述单点登录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=newHashMapist1.7.5ependency>log4jlog4j< version>1.2.17org.slf 4jslf4j-log4j121.7.5< /version>普通模式客户端web.xml文件配置(若采用https协议,将下面的http头修改为h ttps),文本框内的内容可以直接拷贝,并修改红色字体标注的部分CASSingleSignOutFi lterorg.jasig.cas.client.session.Si ngleSignOutFilterter-name>CASSingleSignOutFilter/ CASFilt erorg.jasig.cas.client.authenticati on.AuthenticationFilter>casServerLoginUrlhttp://sso.rocye.com:8080/cas/login param-value>serverName http://app1.rocye. com:18080 CASFilter/tern>>CASValidationFilters>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketVali dationFiltercasServerU rlPrefixhttp://sso. rocye.com:8080/casaram-name>serverNameue>http://app1.rocye.com:18080 ter>CASValidationFilter-name>/CASHtt pServletRequestWrapperFilterorg .jasig.cas.client.util.HttpServletRequestWrapperFilterass>CASHttpServletReq uestWrapperFilter/ CASAssertionThread LocalFilterorg.jasig.cas.client.ut il.AssertionThreadLocalFilterpping>CASAssertionThreadLocalFilterme>/代理模式备注:代理模式 配置是在普通模式配置的基础上加入代理模式的参数配置,只需要在代理客户端配置代理参数,被代理的客户端配置接受代理的参数,未使用cas 代理的客户端配置成普通模式即可。org.j asig.cas.client.session.SingleSignOutHttpSessionListenerr-class>CASSingleSignOutFilte rorg.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>/ CASValidationFilterorg.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 ilterorg.jasig.cas.client.util.HttpSe rvletRequestWrapperFilter CASHttpServletRequestWrapperFilterrl-pattern>/ CASAssertionThreadLocalFilterorg.j asig.cas.client.util.AssertionThreadLocalFilterilter>CASAssertionThreadLocalFilt er/-casend-->备注:validationfilter必须在authenticationfilter之前先被映射(先 映射代理票据验证》普通票据验证》身份验证》其他过滤器)class>org.jasig.cas.client.session.SingleSignOutHttpSessionListen erCASSingleSign OutFilterorg.jasig.cas.client.sessi on.SingleSignOutFilterlter-name>CASSingleSignOutFilter/< /url-pattern>CASFilterter-name>org.jasig.cas.client.authentication.Authen ticationFiltercasServerLog inUrlhttp://sso.rocye.com:8080/cas/logi nserverNamearam-name>http://app2.rocye.com:28080< /init-param>CASFilterer-name>/被代理客户端web.x ml配置CASValidationFilterr-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicket ValidationFiltercasServerU rlPrefixhttp://sso.rocye.com:8080/cas param-value>serverNamem-name>http://app2.rocye.com:28080it-param>acceptAn yProxytruenit-param>redirectAfterValidationvalue>falseilter-name>CASValidationFilter/-pattern>CASHttpServletRequ estWrapperFilterorg.jasig.cas.clien t.util.HttpServletRequestWrapperFilterlter-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。 |
|
|
|
|
|
|
|
|
|
|