jwt单点登录_单点登录SSO技术选型

一些人存在的意义总归是让另一些人成长,然后消失。

——刘同《谁的青春不迷茫》

1、单点登录是什么?

   单点登录主要用于多系统集成,即在多个系统中,用户只需要到一个中央服务器登录一次即可访问这些系统中的任何一个,无须多次登录。

   单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

2、单点登录的常见落地实现技术有哪些?

身份认证技术:

cas(单点登录)、Spring Security OAuth2(第三方登录授权)、jwt (客户端token)

安全控制框架:

spring-security、shiro


我们来分别说一下:

cas(单点登录)

解决问题:多个系统只需登录一次,无需重复登录

原理:

授权服务器,被授权客户端

1、授权服务器(一个)保存了全局的一份session,客户端(多个)各自保存自己的session

2、客户端登录时判断自己的session是否已登录,若未登录,则(告诉浏览器)重定向到授权服务器(参数带上自己的地址,用于回调)

3、授权服务器判断全局的session是否已登录,若未登录则定向到登录页面,提示用户登录,登录成功后,授权服务器重定向到客户端(参数带上ticket【一个凭证号】)

4、客户端收到ticket后,请求服务器获取用户信息

5、服务器同意客户端授权后,服务端保存用户信息至全局session,客户端将用户保存至本地session

默认不支持http请求, 仅支持https 。

缺点:

cas单点登录技术适用于传统应用的场景比较多, 官方示例也是以javaWeb为准, 对微服务化应用,前后端分离应用,支持性较差。

oauth2(第三方登录授权)

解决问题:

第三方系统访问主系统资源,用户无需将在主系统的账号告知第三方,只需通过主系统的授权,第三方就可使用主系统的资源(

如:APP1需使用微信支付,微信支付会提示用户是否授权,用户授权后,APP1就可使用微信支付功能了)。OAuth2是用来允许用户授权第三方应用访问他在另一个服务器上的资源的一种协议,它不是用来做单点登录的,但我们可以利用它来实现单点登录。

原理:

主系统,授权系统(给主系统授权用的,也可以跟主系统是同一个系统),第三方系统。

1、第三方系统需要使用主系统的资源,第三方重定向到授权系统

2、根据不同的授权方式,授权系统提示用户授权

3、用户授权后,授权系统返回一个授权凭证(accessToken)给第三方系统【accessToken是有有效期的】

4、第三方使用accessToken访问主系统资源【accessToken失效后,第三方需重新请求授权系统,以获取新的accessToken】

工作流程如下:

77a963c310f8e9a579c1d03c6218a56d.png

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也可直接被用于认证,也可被加密。

基于JWT认证协议,自己开发SSO服务和权限控制。

流程如下:

ca85d965d2e39bb130c8ed6920af5a5c.png

springSecurity

springSecurity 是spring家族的安全控制框架, 功能非常完善。Spring Security是能够为J2EE项目提供综合性的安全访问控制解决方案的安全框架。

它依赖于Servlet过滤器。这些过滤器拦截进入请求,并且在应用程序处理该请求之前进行某些安全处理。

Spring Security对用户请求的拦截过程如下:  

6e355846a041923d3268a879a473d293.png

Shiro

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

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

a、验证用户来核实他们的身份 

b、对用户执行访问控制,

c、判断用户是否被分配了一个确定的安全角色 

d、判断用户是否被允许做某事 

e、在任何环境下使用 Session API,即使没有 Web 或 EJB 容器。

f、在身份验证,访问控制期间或在会话的生命周期,对事件作出反应。

g、聚集一个或多个用户安全数据的数据源,并作为一个单一的复合用户“视图”。

h、启用单点登录(SSO)功能。内置了jasig-cas

i、为没有关联到登录的用户启用"Remember Me"服务。

3、市面上一些主流的技术搭配:

springSecurity + oauth2 

shiro + cas

jwt

springSecurity + cas   功能较弱,对前后端分离的项目支持不是很好。

比较:

featuresspring-security + oauth2shiro + casjwt
依赖
  • jdk

  • jwt

  • redis

  • redis

  • jdk

  • jwt

--
自定义权限支持,用户登录后将用户的权限列表写入认证服务器支持 , 用户登录后将用户的权限列表写入客户端支持
认证服务集群--CAS支持支持
共享session支持‍支持‍支持
前后端分离‍支持,参数始终携带access_token支持不够友好,需要改造CAS服务端支持
缺点

1、功能较重,学习成本较高,无法短时间内了解的比较深。

2、文档比较复杂。

1、需要集成shiro和cas,项目框架较重。

2、cas官方提供的实例是仅支持javaWeb,对前后端分离的项目支持不够友好,需要对cas服务端进行改造,复杂性较高。

需要自己基于JWT认证协议编写SSO服务,开发周期较长

自己编写的话,需要

文档文档完善文档完善--
优点

1、功能完善,针对权限控制这一块提供了比较完善的解决方案。

2、集成该框架较简单,开发周期短。

3、spring家族产品,和spring-cloud系列的技术集成较简单,更加成熟。

4、可以搭建稳定的认证服务器

1、文档清晰,较简单。

2、功能完善,对权限、用户认证这一块提供的功能非常丰富。

3、集成shiro较简单,开发周期很短。

可以自定义需求,灵活扩展。

综上所述,后续文章我以实现SSO为主。项目中受保护的资源就是用户的信息(包括,用户的基本信息,以及用户所具有的权限),而我们想要访问这这一资源就需要用户登录并授权,OAuth2服务端负责令牌的发放等操作,这令牌的生成我们采用JWT,也就是说JWT是用来承载用户的Access_Token的。最后,Spring Security是用于安全访问的,这里我们我们用来做访问权限控制。

上述文章参考自:

https://blog.csdn.net/u012394095/article/details/79732224?from=singlemessage&isappinstalled=0

https://segmentfault.com/a/1190000005047525

http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html?from=singlemessage&isappinstalled=0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值