CAS为用户签发登陆票据,CAS认证成功后,将TGT对象放入本身的缓存,CAS生成cookie即TGC,自后
登陆时若是有TGC的话,则说明用户以前登陆过,若是没有,则用户须要从新登陆。
TGC (Ticket-granting cookie):存放用户身份认证凭证的cookie,在浏览器和CAS Server用来明确用户身份的凭证。
ST(Service Ticket):CAS服务器经过浏览器分发给客户端服务器的票据。一个特定服务只能有一个惟一的STgit
一、经过git下载
git clone -b 5.1 https://github.com/apereo/cas...
二、maven命令打war包
解压后 cd cas-overlay-template
mvn clean package
三、tomcat部署
从target下找到war放到tomcat的webapps里,启动便可github
配置cas服务端
War包web-inf的application.properties文件web
一、配置静态密码
原cas.authn.accept.users=casuser::Mellon改成
cas.authn.accept.users=admin::111111
二、增长受权,支持http
增长cas.tgc.secure=false
cas.serviceRegistry.initFromJson=true
关于ssl的都屏蔽
修改servicesHTTPSandIMAPS-10000001.json,修改成https|imaps|httpspring
基于springboot应用程序,改造原登陆代码,实现cas服务端登陆后当前程序不须要登陆。
本例没有使用cas官方客户端,即本例仅经过跳转到cas服务端建立登陆cookie。而后登陆成功后返回当前的应用的固定方法,由其根据返回的TICKET经过get请求去cas服务端确认是不是正常的票据,并取的登陆帐号,而后根据帐号进入系统。
这里业务系统的登陆权限控制仍使用自带的。即只有第一次登陆涉及到cas,后续全部请求不在与cas有关系。
如下是两个系统,入口地址
系统1:casapp1.com:8081/xit1/loginSsoValidate
系统2:casapp2.com:8082/xt2/loginSsoValidatejson
第一次在浏览器输入系统1的入口地址
因为此时在浏览器没有ca服务给写入的tgc cookie。会经过代码重定向到casserver进行登陆认证。
认证成功后会根据前期提供的service地址,再回调,并给客户端生成tgc cookie。
核心程序以下:浏览器
@RequestMapping(value={"/loginSsoValidate"} public String loginSso(HttpServletRequest request, HttpServletResponse response, Model model, LoginBean loginBean) { String ticket= request.getParameter("ticket"); //第一次登陆,直接重定向到casserver if(ticket==null||"".equals(ticket)){ return "redirect:"+"http://casserver.com:8080/cas/login?service=http%3a%2f%2fcasapp1.com%3a8081%2fepm%2floginSsoValidate"; } //登陆成功后回调,从server端根据票据获取登陆信息。有了登陆帐号再去进行本身的登陆受权控制。 ResponseEntity<String> resp = template.exchange( "http://casserver.com:8080/cas/serviceValidate?service=http://casapp1.com:8081/epm/loginSsoValidate&ticket="+ticket, HttpMethod.GET, null, String.class); String body = resp.getBody(); Document document; String portalname=""; try { document = DocumentHelper.parseText(body); Node userNode=document.selectSingleNode("//cas:user"); if(userNode!=null){ //根据节点对象获取登陆帐号 portalname=userNode.getText(); }else{ portalname=""; } } catch (DocumentException e1) { e1.printStackTrace(); }
单点登陆进程分析(对应上面程序)
图片为重定向到casserver的效果缓存
一、重定向到casserver登陆界面 ============================================================= WHO: audit:unknown WHAT: [event=success,timestamp=Thu Aug 08 15:25:30 CST 2019,source=RankedAuthenticationProviderWebflowEventResolver] ACTION: AUTHENTICATION_EVENT_TRIGGERED APPLICATION: CAS WHEN: Thu Aug 08 15:25:30 CST 2019 CLIENT IP ADDRESS: 127.0.0.1 SERVER IP ADDRESS: 127.0.0.1 二、登陆认证 ============================================================= WHO: admin WHAT: Supplied credentials: [admin] ACTION: AUTHENTICATION_SUCCESS APPLICATION: CAS WHEN: Thu Aug 08 15:27:50 CST 2019 CLIENT IP ADDRESS: 127.0.0.1 SERVER IP ADDRESS: 127.0.0.1 三、Tgc-cookie生成 ============================================================= WHO: admin WHAT: TGT-**********************************************DXpPUQE1bK-lenovo-PC ACTION: TICKET_GRANTING_TICKET_CREATED APPLICATION: CAS WHEN: Thu Aug 08 15:27:50 CST 2019 CLIENT IP ADDRESS: 127.0.0.1 SERVER IP ADDRESS: 127.0.0.1 四、st(tiket票据)生成 ============================================================= WHO: admin WHAT: ST-7-asvaBsIRu1qPlNcPVbAJ-lenovo-PC for http://casapp1.com:8081/epm/loginSsoValidate ACTION: SERVICE_TICKET_CREATED APPLICATION: CAS WHEN: Thu Aug 08 15:27:50 CST 2019 CLIENT IP ADDRESS: 127.0.0.1 SERVER IP ADDRESS: 127.0.0.1 ============================================================= 四、st(tiket票据)验证 ============================================================= WHO: admin WHAT: ST-7-asvaBsIRu1qPlNcPVbAJ-lenovo-PC ACTION: SERVICE_TICKET_VALIDATED APPLICATION: CAS WHEN: Thu Aug 08 15:27:50 CST 2019 CLIENT IP ADDRESS: 127.0.0.1 SERVER IP ADDRESS: 127.0.0.1 单点登陆到第二个系统的时候 一、重定向cas登陆控制,此时发现浏览器已经存在tgc,则不须要登陆 ============================================================= WHO: audit:unknown WHAT: [event=success,timestamp=Thu Aug 08 15:31:48 CST 2019,source=InitialAuthenticationAttemptWebflowEventResolver] ACTION: AUTHENTICATION_EVENT_TRIGGERED APPLICATION: CAS WHEN: Thu Aug 08 15:31:48 CST 2019 CLIENT IP ADDRESS: 127.0.0.1 SERVER IP ADDRESS: 127.0.0.1 二、st(tiket票据)生成 ============================================================= WHO: admin WHAT: ST-8-TT6YJMhAWk22lIUyZHC5-lenovo-PC for http://casapp2.com:8082/cepm/loginSsoValidate ACTION: SERVICE_TICKET_CREATED APPLICATION: CAS WHEN: Thu Aug 08 15:31:48 CST 2019 CLIENT IP ADDRESS: 127.0.0.1 SERVER IP ADDRESS: 127.0.0.1 三、st(tiket票据)验证 ============================================================= WHO: admin WHAT: ST-8-TT6YJMhAWk22lIUyZHC5-lenovo-PC ACTION: SERVICE_TICKET_VALIDATED APPLICATION: CAS WHEN: Thu Aug 08 15:31:49 CST 2019 CLIENT IP ADDRESS: 127.0.0.1 SERVER IP ADDRESS: 127.0.0.1
Request1
【第一步】终端第一次访问CAS—Client1,AuthenticationFilter会截获此请求:
一、首先,检测本地Session没有缓存有用户信息;
二、而后,检测到请求信息中没有ST;
三、因此,CAS—Client1将请求重定向到CAS—Server,并传递 Service (也就是要访问的目的资源地址,以便登陆成功事后转回该地址),例:【https://cas:8443/cas/login?service=http0%3A8081%2F】
【第二步】终端第一次访问CAS—Server:
一、CAS—Server检测到请求信息中没有TGC,因此跳转到本身的登陆页;
二、终端输入用户名、密码登陆CAS—Server,认证成功后,CAS—Server会生成登陆票据—TGT(集成了用户信息与ST),并随机生成一个服务票据—ST与CAS会话标识—TGC。TGT实际上就是Session,而TGC就是这标识这个Session存到Cookie中的SessionID;ST即,根据Service生成Ticket。
三、而后,CAS—Server会将Ticket加在url 后面,而后将请求redirect 回客户web 应用,例如URL为【http://192.168.1.1:8081/web1/?ticket=ST-5-Sx6eyvj7cPPCfn0pMZ】
【第三步】这时,终端携带ticket再次请求CAS—Client1:
一、这时客户端的AuthenticationFilter看到ticket 参数后,会跳过,由其后面的TicketValidationFilter 处理;
二、TicketValidationFilter 会利用httpclient工具访问cas 服务的/serviceValidate 接口, 将ticket 、service 都传到此接口,由此接口验证ticket 的有效性,即向CAS—Server验证ST的有效性。
三、TicketValidationFilter若是获得验证成功的消息,就会把用户信息写入web 应用的session里。至此为止,SSO 会话就创建起来了。
Request2
上面说了SSO 会话已经创建起来了,这时用户在同一浏览器里第二次访问此web 应用(CAS—Client1)时,AuthenticationFilter会在session 里读取到用户信息,这就表明用户已成功登陆,因此就不会去CAS 认证了。
Request3
【第一步】与Request1是彻底同样的,以下:终端第一次访问CAS—Client2,AuthenticationFilter会截获此请求:
一、首先,检测本地Session没有缓存有用户信息;
二、而后,检测到请求信息中没有ST;三、因此,CAS—Client1将请求重定向到CAS—Server,并传递 Service (也就是要访问的目的资源地址,以便登陆成功事后转回该地址),例:【https://cas:8443/cas/login?service=http0%3A8081%2F】
【第二步】而后,终端第二次访问CAS—Server:此时,Request中会带有上次生成的TGC,而后根据TGC(SessionID)去查找是否有对应的TGT(Session),若是有,表明此用户已成功登陆过,因此此时用户没必要再去登陆页登陆(SSO的体现),而CAS—Server会直接用找到的TGT签发一个ST,而后重定向到CAS—Client2,剩下的如Request1中的【第三步】就彻底同样了。tomcat