耶鲁大学主导的开源框架地址:概要单点登录和CASOn
序言
后端时间公司让我研究一下单点登陆,主要目的是怎样在现有的框架中引入单点登陆功能。说实话,因为之前没有接触过,但是网上资料质量良莠不齐,甚至有些误人子弟,让我在实现过程中踩了不少坑。如今,我将一些学习和实践的心得通过本文记录出来,希望能或多或少帮到你们。
原本,我准备仅用一篇文章完成介绍,但我的目标是尽量能扼要易懂,但是为了能让你们便捷复现,所以最终决定以系列的方式进行剖析。 #
概要单点登陆和CAS #
单点登陆(SignOn),简称SSO,其概念网上一搜便知,我不做屁话。简单来说如何实现单点登录,就是只要一次登陆了某个子系统,就顺带登陆了其他的子系统。其目的很简单,就是为了降低用户访问子系统的成本。
目前,实现单点登陆最流行的是CAS框架,这是一个由哈佛学院主导的开源框架,地址为:
#
截至本文撰写时,最新稳定版本为5.3.2。网上的资料教程大多数都是基于4.X版本,早已严重过时,2023年后官方也不在更新维护,不再推荐你们使用。
#
CAS5.X要求JDK版本最低为1.8。而且基于Boot进行了急剧构建,其使用方法以较4.X大相径庭,另外,5.X也引入了更多的特点。具体请参见官方文档。 #
须要注意的一点是,在4.X时代,CAS由jasig社区托管,在5.X时代,CAS已被社区托管,为此,你们在maven下载依赖时,要注意分辨,如: #
???? org.apereo.cas ????cas-server-core ????5.3.2 ????test #
#
???? #org.jasig.cas ????cas-server-core ????4.2.7
CAS原理
#
CAS的原理稍微有些复杂,我们起码要了解TGT、TGC、ST这个三个核心概念,以及整个单点登陆的实现过程。强烈推荐博文《前端须要了解的SSO与CAS知识》,建议你们勿必提早细细品位,钻研透彻,否则后续的实现过程会让你感觉云里雾里。
#
了解了CAS的原理后,还须要注意一点,CAS默认是基于浏览器的单点登陆形式,其依赖于浏览器的和重定向机制。并且,因为联通互联网的发展,顾客端的接入方法早已不限于浏览器,我们更多的须要支持原生应用(如安卓、IOS)的接入。为此,CAS的基于和重定向机制的浏览器登入认证方法有了很大的局限性。另外,当下前后端分离的开发方式已十分广泛,前后端之间都通过REST插口进行恳求。
基于前面的诱因,CAS又单独提供了REST的扩充。本系列对两种形式(浏览器方法、REST形式)的实现就会进行介绍。 #
实现服务端 #
CAS是由顾客端和服务端两部份构成的,本文将先介绍服务端的实现过程,IDE使用Idea2023,JDK使用1.8,使用4.4。 #
服务端实际上是一个Web工程,须要置于Web容器如中运行。CAS官方推荐采用方法来实现服务端,详见官方文档。 #
何为,英文意为覆盖。一言以蔽之,就是官方提供给你一个模板工程,我们只须要将更改或订制的文件覆盖模板工程中对应位置的对应文件(包括代码和资源文件)即可。 #
为什么须要,官方解释很清楚:
#
以上,我觉得最关键有两点: #
1.下载cas--工程 #
首先,下载cas--工程。CAS同时提供了maven和两个类型,太原小异,本文将基于进行介绍,请戳下载地址。
#
使用Idea打开工程,等待依赖下载后,工程如下:
#
image.png
#
该工程的建立文件稍稍复杂,有些功能似乎暂时用不上。但是,假若在一个已有的老旧系统中引入CAS,直接用cas--工程其实不合适,势必须要进行更改。所以,本文将抽取其关键核心的配置,取其精华,重新创建新的工程做以示范。 #
另外,依据官方介绍,该工程支持两种运行方法: #
通过java-jar*.war启动
通过布署至Web容器(如)启动
对于形式1,实际上是由于cas--这个Boot工程内嵌了容器如何实现单点登录,总所周知,这也是Boot推荐的运行方法。方法2实际上是最常见的、标准的JavaWeb工程的运行方法。这儿,因为方法1相对较简单,本文将基于方法2进行介绍。
2.搭建服务端工程
#
我们重点关注cas--工程中cas模块的build.文件,稍稍复杂,我们只聚焦其依赖: #
dependencies?{ ????compile?"org.apereo.cas:cas-server-webapp-tomcat:${project.'cas.version'}@war" ????if?(!project.hasProperty('bootiful'))?{ ????????//?Other?dependencies?may?be?listed?here... ????}?else?{ ????????println?"Running?CAS?in?Bootiful?mode;?all?dependencies?except?the?CAS?web?application?are?ignored." ????} } ##
结合.,可以发觉该工程只依赖于: #
org..cas:cas---:5.3.2@war #
在菜单Build/Build中进行完善,选择: #
image.png
#
image.png
执行后,在build目录中可以见到war文件:
image.png
#
我们将基于这个war文件搭建自己的服务端。新建工程,结构如下:
#
image.png
build.由cas--进行精简,如下: #
group?'com.mystudy.cas'version?'1.0-SNAPSHOT'apply?plugin:?'java'apply?plugin:?'idea'apply?plugin:?"org.springframework.boot"apply?plugin:?"war"sourceCompatibility?=?1.8 buildscript?{ ????repositories?{ ????????mavenLocal() ????????jcenter() ????} ????dependencies?{ ????????classpath?"org.springframework.boot:spring-boot-gradle-plugin:1.5.14.RELEASE" ????} } springBoot?{ ????mainClass?=?"org.springframework.boot.loader.WarLauncher"} bootRepackage?{ ????mainClass?=?"org.apereo.cas.web.CasWebApplication" ????executable?=?false ????excludeDevtools?=?false} bootRun?{ ????addResources?=?true ????classpath?=?sourceSets.main.compileClasspath } war?{ ????baseName?'cas' ????entryCompression?=?ZipEntryCompression.STORED } repositories?{ ????mavenCentral() } dependencies?{ ????compile?"org.apereo.cas:cas-server-webapp-tomcat:5.3.2@war" ????testCompile?group:?'junit',?name:?'junit',?version:?'4.12'}##
在src\main下新建包,之后解压上一小节获取的war包,将META-INF、org、WEB-INF目录拷贝至内: #
image.png #
如上,可以看见这是一个标准的Web工程。CAS默认设计了基本的Web页面(基于和),在此基础上我们可以按需订制。 #
另外,WEB-INF\lib目录中的依赖文件较多,有334个。很显著,使用方法,我们不得不将这种依赖维护到代码库房中,这是由于官方并没有提供这种文件的直接依赖(只能通过war解压获取)。其实,不得已的话你也可以直接使用源码进行开发不使用方法。 #
依据的思路,我们只须要在源码路径src\main中进行订制,并将所有自定义配置文件都放置在src\main\中,但若要更改CAS的配置,一定要保证配置文件的路径和名称与\WEB-INF中一致。 #
例如,我们要更改WEB-INF\.这个Boot配置文件中的.port,我们只须要拷贝其至src\main\目录下进行更改,但是备份WEB-INF中的.为其他名称(如.)即可。这样,建立后的War包中的WEB-INF才会替换为自己的配置文件。 #
这儿提一个小常识,src\main中的所有源码和资源文件在建立后,就会根据包路径保存到WEB-INF\目录下,而外部的依赖会全部保存到WEB-INF\lib目录下。 #
3.服务端运行 #
至此,我们早已搭建起一个最基本的HelloWorld,现今使用Idea配合进行启动。先配置,更改,添加布署建立: #
image.png
#
保持如下设置即可:
image.png
在Idea中启动,耐心等上片刻,期间将会看见如下红色提示信息:
image.png #
启动成功后,开始窃听恳求,提示“READY": #
image.png
#
但是,Idea会手动打开浏览器去访问CAS自带的登入界面:
#
image.png
帐号密码在那里?请看.最后: #
###?CAS?Authentication?Credentials#cas.authn.accept.users=casuser::Mellon#
如上,用户名为,密码为,登陆成功后提示:
image.png #
其实,我们可以在.中更改用户名和密码(别忘了拷贝.)。 #