基于CAS的单点登录系统的研究与实现

2016-12-15 02:47杨旭东
软件 2016年11期
关键词:访问控制单点浏览器

赵 晋,杨旭东

(北京邮电大学 计算机学院,北京 100876)

基于CAS的单点登录系统的研究与实现

赵 晋,杨旭东

(北京邮电大学 计算机学院,北京 100876)

随着互联网的发展,用户经常需要访问不同系统,这就导致用户需要频繁登录。单点登录就是为解决上述问题而提出的一种技术,它可以使用户只登录某个系统一次即可访问所有相关的应用系统。本文在分析了CAS协议的基本原理后,实现了基于CAS的单点登录系统,为CAS服务器端添加了访问权限控制、缓存层和基于Netty的用户管理系统的功能。

软件工程;单点登录;CAS;统一认证

本文著录格式:赵晋,杨旭东. 基于CAS的单点登录系统的研究与实现[J]. 软件,2016,37(11):118-124

0 引言

随着互联网的发展,网络中提供服务的增多,人们日常生活所需要的信息资源也随之增多。在这种条件下,用户经常需要访问一个内部网络中的多种不同子系统中的资源,由于不同系统的软硬件平台在初期设计时没有统一的访问标准和安全策略,导致用户在访问各个子系统时都需要进行独立的身份认证。这就要求用户需要记住自己在不同系统的身份标志,例如用户名和访问密码等,并且当需要访问多个系统时,需要反复验证用户身份,这无疑会对用户体验造成影响,并且降低了各系统的易用性。为了应对以上问题,产生了单点登录(Single sign-on,简称为SSO)系统。

单点登录的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统[1]。统一认证是单点登录的一种解决方案,统一认证的主要思路就是由唯一一个统一认证系统接管各个不同系统的身份认证模块,各应用系统只需要通过统一认证系统所系统的信息即可实现用户身份的验证[2]。

JASIG-CAS本身为Yale大学开发,后转入JASIG项目。它是一个单点登录系统的框架,它基于统一认证,并且支持跨域访问。同时本身即可作为一个独立的WEB应用程序运行使用,内部使用Spring Web Flow和Spring MVC框架实现。它包括一个JAVA开源服务器组件,并提供多种官方和非官方的客户端组件,官方的客户端组件包括JAVA、.NET、PHP和Apache。并且CAS支持多种协议和存储后端,比如自己独有的CAS协议、OpenID协议、SAML协议、OAuth协议等,存储后端有数据库、LDAP、Active Directory等。并且CAS在全球有很多大学和企业在使用,认可度较高。

本文使用CAS框架来实现单点登录系统,并完善了单点登录系统,使其增加了粗细两种用户访问

控制机制、缓存层和基于Netty 的用户管理系统,用户管理系统包含注册服务器、管理服务器和基于Netty的WebSocket服务器,使得管理者无需刷新用户管理系统页面即可获取到用户信息。

粗粒度访问控制机制使用Mybatis框架实现,细粒度访问控制机制使用shiro实现,缓存层使用了Redis数据库,用户管理系统使用了Netty作为WebSocket服务器,用于转发和推送消息,数据库使用了MySQL。

1 本文采用的方案

先介绍一下CAS框架的主要协议,即CAS协议。

CAS协议是JASIG-CAS特有的基于票据的协议(ticket-based protocol),它实现简单而且功能强大。它涉及到一个或多个CAS客户端和一个CAS服务器。其中CAS服务器负责验证用户身份并授予访问权限。CAS客户端的作用是保护Web应用并从CAS服务器获取已授予访问权限的用户身份。

TGT(Ticket Granting Ticket)票据被存储于名为CASTGC的cookie中,它是已通过CAS服务器身份认证的用户标志。ST (Service Ticket) 票据通过HTTPS协议的Get方式传输,即URL传参,它是用户访问特定Web应用的许可标志 。

CAS协议实现原理如下图1所示:

用户第一次访问应用1时的步骤:

1. 用户通过浏览器向受到CAS客户端保护的Web应用1发出请求。

2. CAS客户端检测到这次访问还未被授权,即没有在cookie中检测到session id,之后将此次请求转发到CAS服务器。

图1 用户首次访问应用1的过程Fig.1 The process of user’s first visit of application 1.

3. CAS服务器检测到用户cookie中没有TGT票据信息,所以向用户浏览器返回登录界面。

4. 用户输入身份信息,并利用POST方式将信息发送到CAS服务器。

5. CAS服务器验证身份信息,验证通过后,创建TGT票据并将TGT票据保存到用户cookie中。之后创建ST票据,并将ST票据信息写入到用户浏览器即将转发的URL的参数中。该URL指向之前用户请求访问的受CAS客户端保护的Web应用1。

6. CAS客户端向CAS服务器发出校验ST票据的请求。

7. CAS服务器验证ST票据信息成功,之后创建并返回一个包含成功信息和其他所需参数的XML文档给受CAS客户端保护的Web应用1。

8. CAS客户端建立session,并将session id写入到用户cookie中。最后将需要转发的去除了ST票据信息的URL返回给用户浏览器。该URL即为用户最初请求的URL。

图2 用户再次访问应用1的过程Fig.2 The process of user’s second visit of application 1.

图3 用户访问应用2时的过程Fig.3 The process of user’s first visit of application 2

9. 用户浏览器再次请求访问Web应用1。

10. CAS客户端在cookie中检测到session id,允许访问。

11. Web应用1返回资源给用户浏览器,如图2所示。

用户再次访问应用1时的步骤:

1. 用户通过浏览器向受到CAS客户端保护的Web应用1发出请求。

2. CAS客户端在cookie中检测到session id,允许访问。

3. Web应用1返回资源给用户浏览器,如图3所示。

用户接下来访问应用2时的步骤:

1. 用户通过浏览器向受到CAS客户端保护的Web应用2发出请求。

2. CAS客户端检测到这次访问还未被授权,即没有在cookie中检测到session id,之后将此次请求转发到CAS服务器。

3. CAS服务器在用户cookie中发现TGT票据信息,验证TGT信息成功后,创建ST票据,并将ST票据信息写入到用户浏览器即将转发的URL的参数中。该URL指向之前用户请求访问的受CAS客户端保护的Web应用2。

4. CAS客户端向CAS服务器发出校验ST票据的请求。

5. CAS服务器验证ST票据信息成功,之后创建并返回一个包含成功信息和其他所需参数的XML文档给受CAS客户端保护的Web应用2。

6. CAS客户端建立session,并将session id写入到用户cookie中。最后将需要转发的去除了ST票据信息的URL返回给用户浏览器。该URL即为用户最初请求的URL。

7. 用户浏览器再次请求访问Web应用2。

8. CAS客户端在cookie中检测到session id,允许访问。

9. Web应用2返回资源给用户浏览器。

由于CAS框架本身不具备权限控制和用户管理的功能,同时在访问量很大,并发量很高的情况下,用户很可能在某个时间内连续登陆,这会对数据库造成很大的压力,可以添加一个缓存层来缓解数据库的压力。

本文采用Redis对单点登录系统进行扩充,添加缓存层。同时修改CAS协议的源码,在上述CAS协议的基础上,对协议进行扩展,在生成ST票据?前添加粗粒度的访问权限控制的功能,即是否有权访问指定网站,同时对于每个网站内的Web资源,利用Shiro添加了细粒度的访问权限控制。最后,用户管理系统使用Netty作为中间的WebSocket服务器,其作用是接收注册服务器的信息并转发到用户管理系统服务器上。

单点登录系统的服务器端和客户端均在Ubuntu 14.04 Kylin系统下开发,服务器端使用CAS框架实现,版本为4.1.1,使用了MyBatis框架来改进CAS服务器,为其添加用户控制访问的功能,存储后端使用数据库验证用户信息,数据库使用 MySQL5.6,并利用Redis数据库为服务器添加了缓存层。客户端使用了Shiro框架,并且Shiro集成了CAS客户端。注册服务器和用户管理服务器使用了SSM(SpringMVC+ Spring+Mybatis)框架实现就,MVC的意思是模型-视图-控制器,它是一种设计模式也是一种设计典范[3]。1WebSocket服务器使用了Netty实现。

2 CAS单点登录系统的实现与改进

2.1 用户访问控制机制与Shiro

一般而言,用户访问控制机制包含以下四点:

1. 身份认证

2. 授权

3. 确定用户权限

4. 执行访问

用户访问控制机制有两个关键的概念。即客体(object)和主体(Subject)。

客体是一种信息实体,它们蕴含或接收信息,客体在Web应用系统中通常指欲访问的URL。主体也是一种实体,它能够引起信息在客体间流动,主体在Web应用系统中通常指用户。

自主访问控制(Discretionary Access Control, DAC)是最常用的一类访问控制机制,是用来判断一个主体是否有权访问客体的一种约束机制。在这种机制下,一个主体(一般在Web应用系统中指管理员)可以自主的说明其资源可以被那些其他主体(一般在Web应用系统中指用户)以何种访问权限进行访问。实现的方法有基于行或者基于列的两种模式。基于行的自主访问控制机制在每个主体上都提供一个该主体可访问的客体的明细表。而基于列的自主访问机制,在每个客体上都提供一个可访问它的主体的明细表[4]。

Shiro的内部实现原理是基于自主访问控制机

制,同时它的机制是基于列的形式。即需要对每一个客体指定可访问它们的主体。

2.2 用户访问控制的实现

项目所采取的用户访问控制并不是完全依赖于Shiro,其中对应用系统即CAS客户端Web应用的访问控制是由修改过后的CAS服务器实现的,即粗粒度的访问控制,而在CAS客户端内的更细粒度的访问控制是由Shiro实现。这样做的原因是因为:根据CAS协议原理,在用户每次访问CAS客户端所保护的Web应用时,若Session中无数据,则需要跳转到CAS服务器,经过一系列操作后才能再次访问Web应用,若由Shiro在客户端实现访问控制功能,则需要在CAS服务器的一系列操作后进行,之后若发现用户无访问权限,则上述在CAS服务器进行的操作都是没有意义的。这就浪费了大量的资源和时间。

所以本项目在CAS服务器端修改源码,在生成ST票据前读取权限数据,判断是否有权访问,由CAS服务器来处理访问控制。如下图5所示:

图5 访问控制流程图1Fig.5 flow-process diagram1 of Access Control

首先用户访问目标应用系统,由于目标应用系统受到CAS客户端的保护,所以用户将携回调地址跳转到CAS服务器,CAS服务器保存回调地址,并验证用户身份,若验证失败则禁止用户访问,若验证成功则存储用户名到服务器端Session中,之后再在另外一个函数中从Session中读取出用户名,从数据库中读取出相应权限信息,最后由之前保存的回调地址验证是否有权限登录,若无权限则返回,有权限则创建ST。

细粒度的访问权限控制由客户端的Shiro实现,即对Web应用内的某些特定资源进行访问权限控制。该部分访问流程如图6所示:

首先用户访问受Shiro及CAS服务器保护的客户端Web系统的指定Web资源,若客户端不存在用户信息需要向CAS服务器请求用户信息,若存在用户信息则从数据库中读取权限信息,之后若有权访问则允许访问,无权访问则禁止访问。

2.3 Redis缓存层的实现

CAS缓存层设计方面可以利用现在非常流行的NoSQL数据库Redis来实现。它是一个基于key-value的存储系统,并使用内存存储和读取数据,并不是传统意义的关系型数据库。与传统的关系型数据库相比,它具备极高的读取性能,所以利用它作为缓存层是非常好的选择。Redis的置换算法将使用LRU

算法,即在数据库已满时添加新数据,会将最近最少使用的数据淘汰。CAS存储后端采用MySQL 5.6。

加入缓存层后的工作流程如图7所示:

在用户输入用户名和密码后,浏览器将身份信息传给CAS服务器。CAS服务器首先进行缓存层验证,即读取Redis数据库中的用户信息,若缓存命中且与用户输入相符,则创建TGT。否则,则从MySQL数据库读取用户信息,若存在且与用户输入相符则先将用户身份信息写入Redis之后创建TGT,若用户信息不存在或与用户输入不服则返回验证失败。

图6 访问控制流程图2Fig.6 flow-process diagram2 of Access Control

图7 缓存层工作流程图Fig.7 flow-process diagram of Cache layer

2.4 基于Netty的用户管理系统的实现

用户管理系统包含注册服务器、基于Netty的WebSocket服务器和管理服务器。其中注册服务器用于完成用户注册,管理服务器实现用户管理。这部分的工作流程图如图8所示:

首先,用户访问注册服务器,请求注册,注册服务器判断用户输入的信息是否合法,若不合法返回注册失败,若合法则完成注册,之后将数据主动推送给基于Netty的WebSocket服务器,WebSocket服务器接受到数据后,再将数据主动推送给用户管理服务器,将用户信息展示并持久化到数据库中。

当管理员登录系统,系统首先从数据库中读取数据,而后进行信息展示,等待接受WebSocket传来的新的用户信息,一旦有新用户信息到来,利用Javascript修改页面信息进行页面展示,这样做无需刷新页面,管理员可以实时的获取新用户信息,并对用户信息进行CRUD操作。

图8 用户管理系统工作流程图Fig.8 flow-process diagram of User Administration

3 总结

本文在分析了CAS协议原理的基础上,实现了一个基于CAS的单点登录系统,并对其进行了改进,增加了粗细两种访问权限控制、缓存层和基于Netty和WebSocket的用户管理系统。粗的访问权限控制由Mybatis框架修改CAS服务器端源码实现,缓存层由Redis实现,用户管理系统利用了基于Netty的WebSocket服务器实现数据的主动推送,使得管理员无需刷新页面即可获取新的信息。之后未来的工作主要集中在系统性能的提高和鲁棒性的提高上。

[1] 郭成宝. 基于Liferay 门户与Lotus Domino OA 单点登录系统的实现[J]. 软件, 2014, 35(1): 72-74.

[2] 潜昕, 罗沙白, 卢康权. 构建基于分布式SOA架构的统一身份认证体系[J]. 软件, 2013, 34(1): 17-19[3]. 葛管库.MVC模式下程序设计[J]. 软件, 2013, 34(2): 49-51.

[3] 沈晴霓, 卿斯汉. 操作系统安全设计[M]. 北京: 机械工业出版社, 2013.

[4] JASIG, CAS协议[OL]. https://apereo.github.io/cas/4.2.x/ protocol/CAS-Protocol.html.

[5] JASIG, CAS Protolcol[OL]. https://apereo.github.io/cas/4.2.x/ protocol/CAS-Protocol.html.

[6] 李俊. 一个基于JASIG-CAS改进的SSO模型及实现[D]. 四川: 电子科技大学, 2011.

[7] 苏悦洪. 基于CAS协议的单点登录系统的研究与改进[D].广州: 华南理工大学, 2014.

A Research and Implementation of Single-Sign-On System based on CAS

ZHAO Jin YANG Xu-dong
(BeiJing University of Post and Telecommunications. Institute of Computer, BeiJing 100876)

With the development of the Internet,users often need to visit different systems,as a result,they need to login the systems frequently.Single-Sign-On(SSO) is a technology which can handle the problem above,users can lonin one system just once and then they can visit all relative systems without logging in again by using it.In this paper,after analyzing the basic of CAS protocol, SSO system based on CAS with the new functions of access control,cache layer and user administration is implemented.

Software engineering; Single-sign-on; CAS; Unified authentication

TP311.52

A

10.3969/j.issn.1003-6970.2016.11.026

赵晋(1990-),男,硕士研究生,计算机软件。

杨旭东,教授,主要研究方向:互联网技术。

猜你喜欢
访问控制单点浏览器
历元间载波相位差分的GPS/BDS精密单点测速算法
超薄异型坯连铸机非平衡单点浇铸实践与分析
反浏览器指纹追踪
ONVIF的全新主张:一致性及最访问控制的Profile A
数字电视地面传输用单频网与单点发射的效果比较
动态自适应访问控制模型
浅析云计算环境下等级保护访问控制测评技术
16吨单点悬挂平衡轴的优化设计
大数据平台访问控制方法的设计与实现
环球浏览器