一般状况下,咱们的单点登陆认证中心要支持多个服务的统一认证。咱们的实现步骤通常是先配置服务注册中心方案、而后配置受权服务、最后重启服务。html
按以上步骤执行完,大部分均可以获得预期的服务管理目的。而有时候在登陆的时候会遇到这种提示:未认证受权的服务
。对于刚接触CAS的人来讲,看到这个提示每每不知道该如何处理。出现这个错误的缘由有不少,好比服务加载失败、服务更新失败、serviceID
正则表达式写错等等,其实归根结底是一个缘由:在登陆过程当中校验受权服务时,没有找到匹配的服务
。git
为何没有匹配到受权服务?github
内部的服务管理机制是什么样的?正则表达式
应该怎么解决?redis
本文将深刻剖析CAS服务管理原理,包括服务管理总体架构、服务初始化过程、服务更新机制、服务校验过程、以及服务管理工具等。经过本文至少能够有如下收获:编程
如上图所示,CAS服务管理的总体架构能够分为三层:缓存
服务注册中心负责存储受权服务,它支持多种存储方案,如内存、JSON文件、JPA、Redis、MongoDb等等。安全
CAS中的服务注册中心实现方案经过实现ServiceRegistry接口来实现:架构
服务管理器负责管理服务注册中心。正是由于有了服务管理器,才实现了服务存储的透明化,使调用方对服务存储方式无感知。也使服务存储更容易扩展,开发者能够根据本身的需求来实现个性化存储。并发
CAS中的服务管理器实现方案经过实现ServicesManager接口来实现:
咱们在这里将服务管理的调用方的统称为服务管理组件。如登陆组件在登陆过程当中须要经过服务管理器获取受权来校验服务、服务定时器定时更新受权服务、服务初始化组件须要在服务启动时初始化受权服务等等。
启用服务初始化功能后(cas.serviceRegistry.initFromJson=true
),服务启动的第一步就是进行服务初始化,其目的是将注册中心中的受权服务加载到服务管理器中。
服务管理器充当访问服务的缓存层,后续的服务访问都要经过服务管理器。
服务的初始化过程包含如下几步:
不一样的服务管理器还会基于servicesMap将服务保存到本身的服务集合中,以实现个性化管理策略。
CAS中的服务更新是经过定时调度来实现的,启用或关闭此功能经过cas.serviceRegistry.schedule.enabled=true/false
来控制。
服务的更新过程包含如下几步:
安全起见,CAS单点登陆的过程当中都要进行受权服务的校验。
服务的校验过程包含如下几步:
InitialFlowSetupAction
,并将其添加到登陆流程里;InitialFlowSetupAction
,来校验服务;未认证受权的服务
提示。经过以上的服务校验过程,能够获得如下结论:
未认证受权的服务
提示,必定是服务匹配问题,要从这方面找缘由和解决方案。CAS官方推出的服务管理工具是:CAS Management
。咱们这里主要介绍CAS Management的功能和实现原理。
了解完服务的加载、更新机制后,若是有个性化需求,咱们也能够实现本身的服务管理工具。
CAS Management在实现了服务管理功能基础上,还有两个核心亮点:服务版本控制和委托用户管理。
服务管理基础功能就不介绍了,已经包含在了服务版本控制流程内。
服务的版本控制是经过在本地创建一个git仓库,而后经过操做这个git仓库,发布后同步到CAS Server服务注册中心中,最后经过服务管理的更新机制,同步到CAS Server中。
服务的版本控制的好处显而易见:
服务版本控制流程:
提交
按钮提交本次变动;发布
按钮,发布
后会将仓库中的服务经过CAS Server服务管理器同步到CAS Server服务注册中心;CAS Management的委托用户管理功能相似github上的PR,在以上服务版本控制的前面多出了PR的步骤,即:
马军伟,草根码农一枚,jbone项目做者。
关注领域:微服务、高并发编程、单点登陆等。
Github:github.com/417511458
Gitee: gitee.com/majunwei201…
主页:jbone.cn
QQ: 417511458
公众号:writebugs
原创文章,欢迎转载!但请务必保留全文,并说明出处