跳至主要內容

SSO协议

ChenSinooauthsso大约 4 分钟

1、写在前面

一个系统一般都会有用户角色权限相关的概念,用户需要登录系统并且拥有相应的权限后才能访问对应的资源。

  • 认证(Authentication),即确认用户的身份,也就是上面说的要输入帐号密码登录
  • 授权(Authorization),即用户要访问某资源,必须要拥有对应权限

也就是说,用户登录(认证)成功后,会获得此用户拥有的权限,用户在去访问资源时,系统会校验其拥有的权限是否可以访问这个资源。

2、SSO和OAUTH2介绍

SSO(SingleSignOn)的出现是为了解决多系统认证的问题的,这里特别强调一下,它是解决认证问题的。就是通过用户的一次性鉴别登录,当用户在身份认证服务器上登录一次以后,即可获得访问单点登录系统中其他关联系统和应用软件的权限,同时这种实现是不需要管理员对用户的登录状态或其他信息进行修改的,这意味着在多个应用系统中,用户只需一次登录就可以访问所有相互信任的应用系统。

oauth是一个协议,它们定义了一套流程规范,你要实现我这个协议,就得按照我的规范来,和java中jdbc一样,sun公司负责规定一套规范,提供一套接口,下游的用户自行负责实现,你具体怎么实现我不关心,你要做的就是实现我规定的一套规范。

OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。OAuth强调的是授权,当然要想获取授权前你必须认证,就像第一节说的,用户只有登录后才能获得对应用户的权限,这一步是无法绕开的。

3、SSO实现

单点登录实现中,系统之间的协议对接是非常重要的一环,一般涉及的标准协议类型有 CAS、OAuth、OpenID Connect、SAML。

另外国产的SA-TOKEN项目也有sso和oauth实现

3.1 CAS

Central Authentication Service简称CAS,是一种常见的B/S架构的SSO协议。和其他任何SSO协议一样,用户仅需登陆一次,访问其他应用则无需再次登陆。顾名思义,CAS是一种仅用于Authentication的服务,它和OAuth/OIDC协议不一样,并不能作为一种Authorization的协议。当前CAS协议包括CAS 1.0、CAS2.0、CAS3.0版本,这三个版本的认证流程基本类似。CAS的认证流程通过包括几部分参与者:

Client: 通常为使用浏览器的用户 CAS Client: 实现CAS协议的Web应用 CAS Server: 作为统一认证的CAS服务器

4、各种协议对比

单纯的单点登录,其实无需授权中心有一套自己的用户和权限,单点登录是只管登录,登录后从业务系统自行获取自己的权限,所以从这个角度来说sso也有它自己的优势,它不像oauth那样还要维护一套用户权限系统,如果仅仅作单点登录不用权限的话用cas显然更有优势。

以下图片是各种实现的对比图来自知乎open in new window,我并不赞同他的观点,仅作参考 20230104171826

以下对比来自sa-token官网open in new window

功能点SSO单点登录OAuth2.0
统一认证支持度高支持度高
统一注销支持度高支持度低
多个系统会话一致性强一致弱一致
第三方应用授权管理不支持支持度高
自有系统授权管理支持度高支持度低
Client级的权限校验不支持支持度高
集成简易度比较简单难度中等