SSO单点登录技术选型

SSO描述

定义

单点登录(SingleSignOn,SSO),就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后,即可获得访问单点登录系统中其他关联系统和应用软件的权限,同时这种实现是不需要管理员对用户的登录状态或其他信息进行修改的,这意味着在多个应用系统中,用户只需一次登录就可以访问所有相互信任的应用系统。这种方式减少了由登录产生的时间消耗,辅助了用户管理,是目前比较流行的。

SSO原理

浏览器 application AC(认证中心) 发送请求 未登录 返回登录页 请求登录 登录成功 验证账户密码. 返回登录标识 携带标识,发送请求 浏览器 application AC(认证中心)

步骤:

  • 浏览器想应用发送请求
  • 请求验证用户是否登录,未登录则返回应用的登录页面
  • 浏览器向AC发起登录请求
  • 认证中心验证账户密码正确后,返回登录标识
  • 浏览器携带登录标识想应用发起请求

技术选型

其中常用的SSO技术分别为cas,oauth2。针对这三种技术如下分别介绍其优缺点。

CAS

由于对cas的技术没有开发过,在实际场景中使用过,针对于集成来说cas不算很复杂,对技术的要求性较高。

缺点:cas单点登录技术适用于传统应用场景,官方示例已Javaweb为准,对springcloud等微服务、前后端分析的项目支持性差。
解决问题:常规的单点登录,多个系统只需要登录一次,无需重复登录。
原理:主要利用session进行验证是否登录。

  1. 授权服务器(一个)保存了全局的一份session,客户端(多个)各自保存自己的session
  2. 客户端登录时判断自己的session是否已登录,若未登录,则(告诉浏览器)重定向到授权服务器(参数带上自己的地址,用于回调)
  3. 授权服务器判断全局的session是否已登录,若未登录则定向到登录页面,提示用户登录,登录成功后,授权服务器重定向到客户端(参数带上ticket【一个凭证号】)
  4. 客户端收到ticket后,请求服务器获取用户信息
  5. 服务器同意客户端授权后,服务端保存用户信息至全局session,客户端将用户保存至本地session

oauth2

对于oauth2有做过专门的开发和使用,对技术要求性高,在搭建过程中总是会出现401的情况,一般来说是由于密码或者配置问题导致的
缺点: 功能重,学习成本较高
解决问题:第三方系统访问主系统资源,用户无需将在主系统的账号告知第三方,只需通过主系统的授权,第三方就可使用主系统的资源
原理:主系统,授权系统(给主系统授权用的,也可以跟主系统是同一个系统),第三方系统
1、第三方系统需要使用主系统的资源,第三方重定向到授权系统
2、根据不同的授权方式,授权系统提示用户授权
3、用户授权后,授权系统返回一个授权凭证(accessToken)给第三方系统【accessToken是有有效期的】
4、第三方使用accessToken访问主系统资源【accessToken失效后,第三方需重新请求授权系统,以获取新的accessToken】

OAUTH2中的角色

  • Resource Server: 被授权访问的资源
  • Authotization Server:OAUTH2认证授权中心
  • Resource owner : 资源拥有者
  • Client:使用API的客户端(如Android 、IOS、web app)

工作流程
工作流程

jwt (客户端token)

Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519). 该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。

spring-security

spring-security 是spring家族的安全控制框架, 功能非常完善。 Spring Security是能够为J2EE项目提供综合性的安全访问控制解决方案的安全框架。它依赖于Servlet过滤器。这些过滤器拦截进入请求,并且在应用程序处理该请求之前进行某些安全处理

shiro

Apache Shiro 是一个强大而灵活的开源安全框架,它干净利落地处理身份认证,授权,企业会话管理和加密。

以下是你可以用 Apache Shiro 所做的事情:

  • 验证用户来核实他们的身份
  • 对用户执行访问控制
  • 判断用户是否被分配了一个确定的安全角色
  • 判断用户是否被允许做某事
  • 在任何环境下使用 Session API,即使没有 Web 或 EJB 容器
  • 在身份验证,访问控制期间或在会话的生命周期,对事件作出反应
  • 聚集一个或多个用户安全数据的数据源,并作为一个单一的复合用户“视图”
  • 启用单点登录(SSO)功能。 内置了jasig-cas,为没有关联到登录的用户启用"Remember Me"服务

技术搭配

  • spring-security + oauth2
  • shiro + cas
  • JWT

比较

特点spring-security + oauth2shiro + casJWT
依赖jdk、jwt、redisjdk、jwt、redis
自定义权限支持,用户登录后将用户的权限列表写入认证服务器支持 , 用户登录后将用户的权限列表写入客户端支持
认证服务集群支持支持
共享session支持支持支持
前后端分离支持,参数始终携带access_token支持不够友好,需要改造CAS服务端支持
缺点-功能较重,学习成本较高,无法短时间内了解的比较深
- 文档比较复杂
-需要集成shiro 和 cas , 项目框架较重
-cas官方提供的示例是仅支持javaWeb, 对前后端分离的项目支持不够友好,需要对CAS服务端进行改造 , 复杂性较高
-需要自己基于JWT认证协议编写SSO服务,开发周期较长
优点- 功能完善,针对权限控制这一块提供了比较完善的解决方案
-集成该框架较简单,开发周期较短
-spring家族产品,和spring-cloud系列的技术集成较简单,更加成熟
-可以搭建稳定的认证服务器
-文档清晰,较简单
-功能完善,对权限,用户认证这一块提供的功能非常丰富
-集成shiro较简单,开发周期很短
-可以自定义需求,灵活扩展

参考文档: link.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值