转自:https://blog.csdn.net/u012394095/article/details/79732224
参考:https://blog.csdn.net/fay462298322/article/details/78054063
参考:https://blog.csdn.net/zhangjingao/article/details/81735041
参考:https://blog.csdn.net/weixin_38312502/article/details/81180260
参考代码:https://github.com/zhangjingao/sso
【
参考:https://blog.csdn.net/xqhys/article/details/79008531
参考代码:https://github.com/ITDragonBlog/daydayup
】
身份认证技术
cas(单点登录)
解决问题:多个系统只需登录一次,无需重复登录
原理:授权服务器,被授权客户端
1、授权服务器(一个)保存了全局的一份session,客户端(多个)各自保存自己的session
2、客户端登录时判断自己的session是否已登录,若未登录,则(告诉浏览器)重定向到授权服务器(参数带上自己的地址,用于回调)
3、授权服务器判断全局的session是否已登录,若未登录则定向到登录页面,提示用户登录,登录成功后,授权服务器重定向到客户端(参数带上ticket【一个凭证号】)
4、客户端收到ticket后,请求服务器获取用户信息
5、服务器同意客户端授权后,服务端保存用户信息至全局session,客户端将用户保存至本地session
默认不支持http请求, 仅支持https
缺点:
cas单点登录技术适用于传统应用的场景比较多, 官方示例也是以javaWeb为准, 对微服务化应用,前后端分离应用,
支持性较差
oauth2(第三方登录授权)
解决问题:第三方系统访问主系统资源,用户无需将在主系统的账号告知第三方,只需通过主系统的授权,第三方就可使用主系统的资源(
如:APP1需使用微信支付,微信支付会提示用户是否授权,用户授权后,APP1就可使用微信支付功能了)
原理:主系统,授权系统(给主系统授权用的,也可以跟主系统是同一个系统),第三方系统
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也可直接被用于认证,也可被加密。
基于JWT认证协议,自己开发SSO服务和权限控制。 流程如下
安全控制框架
spring-security
spring-security 是spring家族的安全控制框架, 功能非常完善。 Spring Security是能够为J2EE项目提供综合性的安全访问控制解决方案的安全框架。
它依赖于Servlet过滤器。这些过滤器拦截进入请求,并且在应用程序处理该请求之前进行某些安全处理。
Spring Security对用户请求的拦截过程如下:
shiro
Apache Shiro 是一个强大而灵活的开源安全框架,它干净利落地处理身份认证,授权,企业会话管理和加密。
以下是你可以用 Apache Shiro 所做的事情:
验证用户来核实他们的身份
对用户执行访问控制,
判断用户是否被分配了一个确定的安全角色
判断用户是否被允许做某事
在任何环境下使用 Session API,即使没有 Web 或 EJB 容器。
在身份验证,访问控制期间或在会话的生命周期,对事件作出反应。
聚集一个或多个用户安全数据的数据源,并作为一个单一的复合用户“视图”。
启用单点登录(SSO)功能。 内置了jasig-cas
为没有关联到登录的用户启用"Remember Me"服务
市面上一些主流的技术搭配
spring-security + oauth2
spring-security + cas 功能较弱,对前后端分离的项目支持不是很好
shiro + cas
比较
features spring-security + oauth2 shiro + cas jwt
依赖
jdk
jwt
redis
redis
jdk
jwt
—
自定义权限 支持,用户登录后将用户的权限列表写入认证服务器 支持 , 用户登录后将用户的权限列表写入客户端 支持
认证服务集群 CAS支持 支持
共享session 支持 支持 支持
前后端分离 支持,参数始终携带access_token 支持不够友好,需要改造CAS服务端 支持
缺点
功能较重,学习成本较高,无法短时间内了解的比较深
文档比较复杂
需要集成shiro 和 cas , 项目框架较重,
cas官方提供的示例是仅支持javaWeb, 对前后端分离的项目支持不够友好,需要对CAS服务端进行改造 , 复杂性较高。
需要自己基于JWT认证协议编写SSO服务,开发周期较长
自己编写的话,需要
文档 文档完善 文档完善 —
优点
功能完善,针对权限控制这一块提供了比较完善的解决方案
集成该框架较简单,开发周期较短
spring家族产品,和spring-cloud系列的技术集成较简单,更加成熟
可以搭建稳定的认证服务器。
文档清晰,较简单
功能完善,对权限,用户认证这一块提供的功能非常丰富
集成shiro较简单,开发周期很短。
可以自定义需求,灵活扩展
---------------------
作者:sharedCode
来源:CSDN
原文:https://blog.csdn.net/u012394095/article/details/79732224
版权声明:本文为博主原创文章,转载请附上博文链接!