CAS 实现站内单点登录及实现第三方 OAuth、OpenId 登录(一)

Stella981
• 阅读 1061

一、CAS 介绍

    CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目。CAS 具有以下特点:

开源的企业级单点登录解决方案
CAS Server 为需要独立部署的 Web 应用
CAS Client 支持非常多的客户端(这里指单点登录系统中的各个 Web 应用),包括官方和非官方提供的 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等 CAS Client 包
方便集成第三方OpenID、oAuth等等登录,只需进行简单配置和扩展
内置RememberMe 功能,当认证会话过期后可记录上一次登录用户账户

二、原理

    从结构上看,CAS 包含两个部分: CAS Server 和 CAS Client。CAS Server 需要独立部署,主要负责对用户的认证工作;CAS Client 负责处理对客户端受保护资源的访问请求,需要登录时,重定向到 CAS Server。图2 是 CAS 最基本的协议过程:

    CAS Client 与受保护的客户端应用部署在一起,以 Filter 方式保护受保护的资源。对于访问受保护资源的每个 Web 请求,CAS Client 会分析该请求的 Http 请求中是否包含 Service Ticket,如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的 CAS Server 登录地址,并传递 Service (也就是要访问的目的资源地址),以便登录成功过后转回该地址。用户在第 3 步中输入认证信息,如果登录成功,CAS Server 随机产生一个相当长度、唯一、不可伪造的 Service Ticket,并缓存以待将来验证,之后系统自动重定向到 Service 所在地址,并为客户端浏览器设置一个 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新产生的 Ticket 过后,在第 5,6 步中与 CAS Server 进行身份合适,以确保 Service Ticket 的合法性。
    在该协议中,所有与 CAS 的交互均采用 SSL 协议,确保,ST 和 TGC 的安全性。协议工作过程中会有 2 次重定向的过程,但是 CAS Client 与 CAS Server 之间进行 Ticket 验证的过程对于用户是透明的。
    另外,CAS 协议中还提供了 Proxy (代理)模式,以适应更加高级、复杂的应用场景。

CAS 实现站内单点登录及实现第三方 OAuth、OpenId 登录(一)

三、基本概念描述

  • Principal

  • Credentials:身份凭证,指在系统用用于身份验证的唯一依据

  • ticket

三、pom.xml 配置

配置所需 jar 包,和编译参数

<!-- springframework start -->
... ...
<dependency>
    <groupId>org.springframework.webflow</groupId>
    <artifactId>spring-webflow</artifactId>
</dependency>
<!-- springframework end -->

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

<!-- cas start -->
<dependency>
    <groupId>org.jasig.cas</groupId>
    <artifactId>cas-server-core</artifactId>
</dependency>
<dependency>
    <groupId>org.jasig.cas</groupId>
    <artifactId>cas-server-support-openid</artifactId>
</dependency>
<dependency>
    <groupId>org.jasig.cas</groupId>
    <artifactId>cas-server-support-oauth</artifactId>
</dependency>
<dependency>
    <groupId>org.jasig.cas</groupId>
    <artifactId>cas-server-integration-memcached</artifactId>
</dependency>
<dependency>
    <groupId>org.jasig.cas.client</groupId>
    <artifactId>cas-client-core</artifactId>
</dependency>
<!-- cas end -->

<dependency>
    <groupId>org.scribe</groupId>
    <artifactId>scribe-up</artifactId>
</dependency>

<dependency>
    <groupId>com.buession</groupId>
    <artifactId>cas-server-support</artifactId>
</dependency>
<dependency>
    <groupId>com.buession</groupId>
    <artifactId>open</artifactId>
</dependency>
<dependency>
    <groupId>com.buession</groupId>
    <artifactId>oauth-client</artifactId>
</dependency>
<dependency>
    <groupId>com.buession</groupId>
    <artifactId>mcrypt</artifactId>
</dependency>

四、com.buession jar 包说明

  1. cas-server-support
    cas server 的补充,重写了部分 cas server API

    git clone git@github.com:eduosi/cas-server-support.git
    
  2. open

    git clone git@github.com:eduosi/open.git
    
  3. oauth-client

    scribe-up 的扩展,增加了 Weibo、QQ、Alipay Provider

    git clone git@github.com:eduosi/oauth-client.git
    
  4. mcrypt:
    对象加密工具,支持除 null 以外的且能转换字符串的任意对象多次加密

    git clone git@github.com:eduosi/Mcrypt.git
    

五、properties 文件加载

修改 WEB-INF/spring-configuration/propertyFileConfigurer.xml

<bean id="propertyPlaceholderConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
    p:location="/WEB-INF/cas.properties" />

<bean id="propertyPlaceholderConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            ... ...
        </list>
    </property>
    <property name="ignoreResourceNotFound" value="true" />
</bean>

定义不同环境的 properties 文件

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
【实践篇】基于CAS的单点登录实践之路
上个月我负责的系统SSO升级,对接京东ERP系统,这也让我想起了之前我做过一个单点登录的项目。想来单点登录有很多实现方案,不过最主流的还是基于CAS的方案,所以我也就分享一下我的CAS实践之路。
Wesley13 Wesley13
2年前
CAS 4.1.x 单点登出(退出登录)的原理解析
  我们在项目中使用了cas作为单点登录的解决方案,当在集成shiro做统一权限控制的时候,发现单点退出登录有坑,所以啃了一下CAS的单点登出的源码,在此分享一下。1、回顾单点登录中一些关键事件  在解析CAS单点登出的原理之前,我们先回顾一下在单点登录过程中,CAS服务器和CAS客户端都做了一些什么事,这些事
Easter79 Easter79
2年前
SpringMVC对接CAS客户端实现单点登录SSO
业务场景:之前写过CAS服务端的例子,也对接过基于SpringBoot的CAS,不过最近项目要对接第三方的CAS实现单点登录,而我们项目是基于SpringMVC的,所以就摸索了一下对接方案,其它博客可以参考我之前专栏:CAS单点登录系列博客(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2
Wesley13 Wesley13
2年前
CAS单点登录(一):单点登录与CAS理论介绍
一、什么是单点登录(SSO)  单点登录主要用于多系统集成,即在多个系统中,用户只需要到一个中央服务器登录一次即可访问这些系统中的任何一个,无须多次登录。  单点登录(SingleSignOn),简称为SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Stella981 Stella981
2年前
CAS 实现站内单点登录及实现第三方 OAuth、OpenId 登录(二)
一、登录表单<form:form id"loginForm" method"post" commandName"${commandName}" htmlEscape"true"    <form:errors path"" element"em" cssClass"" /    <c:if t
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这