cas单点登陆认证的场景演示与分析

概念:

CAS为用户签发登陆票据,CAS认证成功后,将TGT对象放入本身的缓存,CAS生成cookie即TGC,自后
登陆时若是有TGC的话,则说明用户以前登陆过,若是没有,则用户须要从新登陆。
TGC (Ticket-granting cookie):存放用户身份认证凭证的cookie,在浏览器和CAS Server用来明确用户身份的凭证。
ST(Service Ticket):CAS服务器经过浏览器分发给客户端服务器的票据。一个特定服务只能有一个惟一的STgit

安装CAS服务端

一、经过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|http
图片描述
图片描述spring


自有应用接入示例

基于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

Tgc cookie在浏览器的状况

图片描述

总结概括

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

相关文章
相关标签/搜索