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

15次阅读

共计 4425 个字符,预计需要花费 12 分钟才能阅读完成。

概念:

CAS 为用户签发登录票据,CAS 认证成功后,将 TGT 对象放入自己的缓存,CAS 生成 cookie 即 TGC,自后
登录时如果有 TGC 的话,则说明用户之前登录过,如果没有,则用户需要重新登录。
TGC(Ticket-granting cookie):存放用户身份认证凭证的 cookie,在浏览器和 CAS Server 用来明确用户身份的凭证。
ST(Service Ticket):CAS 服务器通过浏览器分发给客户端服务器的票据。一个特定服务只能有一个唯一的 ST

安装 CAS 服务端

1、通过 git 下载
git clone -b 5.1 https://github.com/apereo/cas…
2、maven 命令打 war 包
解压后 cd cas-overlay-template 
mvn clean package
3、tomcat 部署
从 target 下找到 war 放到 tomcat 的 webapps 里,启动即可

配置 cas 服务端
War 包 web-inf 的 application.properties 文件

1、配置静态密码
原 cas.authn.accept.users=casuser::Mellon 改为
cas.authn.accept.users=admin::111111
2、增加授权,支持 http
增加 cas.tgc.secure=false
cas.serviceRegistry.initFromJson=true
关于 ssl 的都屏蔽
修改 servicesHTTPSandIMAPS-10000001.json,修改为 https|imaps|http


自有应用接入示例

基于 springboot 应用程序,改造原登录代码,实现 cas 服务端登录后当前程序不需要登录。
本例没有使用 cas 官方客户端,即本例仅通过跳转到 cas 服务端创建登录 cookie。然后登录成功后返回当前的应用的固定方法,由其根据返回的 TICKET 通过 get 请求去 cas 服务端确认是否是正常的票据,并取的登录账号,然后根据账号进入系统。
这里业务系统的登录权限控制仍使用自带的。即只有第一次登录涉及到 cas,后续所有请求不在与 cas 有关系。
以下是两个系统,入口地址
系统 1:casapp1.com:8081/xit1/loginSsoValidate
系统 2:casapp2.com:8082/xt2/loginSsoValidate

第一次在浏览器输入系统 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 的效果

1、重定向到 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
2、登录认证
=============================================================
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
3、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
4、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
=============================================================
4、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

单点登录到第二个系统的时候
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
2、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
3、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 在浏览器的情况

正文完
 0