实现单点登陆说到底就是要解决如何产生和存储那个信任,再就是其余系统如何验证这个信任的有效java
性,所以要点也就如下两个:一、存储信任 ;二、服务器生产~验证信任 ; 三、拿到服务器再次验证。web
单点登陆的常见落地实现技术有哪些?redis
1. cas(单点登陆)spring
2. Spring Security OAuth2(第三方登陆受权:QQ登录)后端
3. jwt (客户端token:原生)浏览器
安全控制框架:安全
1. spring-security服务器
2. shiro:微信
解决问题:多个系统只需登陆一次,无需重复登陆网络
原理:受权服务器,被受权客户端 CS架构
1. 受权服务器(一个)保存了全局的一份session,客户端(多个)各自保存本身的session
2. 客户端登陆时判断本身的session是否已登陆,若未登陆,则(告诉浏览器)重定向到受权服务器
(参数带上本身的地址,用于回调)
3. 受权服务器判断全局的session是否已登陆,若未登陆则定向到登陆页面,提示用户登陆,登陆成
功后,受权服务器重定向到客户端(参数带上ticket【一个凭证号】)
4. 客户端收到ticket后,请求服务器获取用户信息
5. 服务器赞成客户端受权后,服务端保存用户信息至全局session,客户端将用户保存至本地session
6. 默认不支持http请求, 仅支持https 。 生成证书 keytools
缺点:cas单点登陆技术适用于传统应用的场景比较多, 官方示例也是以javaWeb为准, 对微服务化应
用,先后端分离应用,支持性较差。
解决问题:第三方系统访问主系统资源,用户无需将在主系统的帐号告知第三方,只需经过主系统的授
权,第三方就可以使用主系统的资源
如:APP1需使用微信支付,微信支付会提示用户是否受权:取消,用户受权后,APP1就可以使用微信支
付功能了。
OAuth2是用来容许用户受权第三方应用访问他在另外一个服务器上的资源的一种协议,它不是用来作单
点登陆的,但咱们能够利用它来实现单点登陆。
原理:主系统,受权系统(给主系统受权用的,也能够跟主系统是同一个系统),第三方系统。
1. 第三方系统须要使用主系统的资源,第三方重定向到受权系统
2. 根据不一样的受权方式,受权系统提示用户受权
3. 用户受权后,受权系统返回一个受权凭证(accessToken)给第三方系统【accessToken是有有效
期的】
4. 第三方使用accessToken访问主系统资源【accessToken失效后,第三方需从新请求受权系统,以
获取新的accessToken】
Resource Server: 被受权访问的资源
Authotization Server:OAUTH2认证受权中心
Resource owner : 资源拥有者
Client:使用API的客户端(如Android 、IOS、web app)
难度较大,须要你了解不少协议~
Json web token (JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC
7519).
该token被设计为紧凑且安全的,特别适用于分布式站点的单点登陆(SSO)场景。JWT的声明通常被用
来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也能够增
加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
基于JWT认证协议,本身开发SSO服务和权限控制。
springSecurity 是spring家族的安全控制框架, 功能很是完善。
Spring Security是可以为J2EE项目提供综合性的安全访问控制解决方案的安全框架。
它依赖于Servlet过滤器。这些过滤器拦截进入请求,而且在应用程序处理该请求以前进行某些安全处
理。
spring-boot-starter-springsecurity
特征 spring-security + oauth2 shiro + cas jwt
依赖 jdk、jwt、redis redis、jdk、jwt --
自定义
权限
支持,用户登陆后将用户的权限列表
写入认证服务器
支持 , 用户登陆后将用户
的权限列表写入客户端 支持
认证服
务集群 -- CAS支持 支持
共享
session
支持 支持 支持
先后端
分离 支持,参数始终携带access_token
支持不够友好,须要改造
CAS服务端 支持
Apache Shiro 是一个强大而灵活的开源安全框架,它干净利落地处理身份认证,受权,企业会话管理
和加密。
如下是 Apache Shiro 能够作的事情:
1. 验证用户来核实他们的身份
2. 对用户执行访问控制
3. 判断用户是否被分配了一个肯定的安全角色
4. 判断用户是否被容许作某事
5. 在任何环境下使用 Session API,即便没有 Web 或 EJB 容器。
6. 在身份验证,访问控制期间或在会话的生命周期,对事件做出反应。
7. 汇集一个或多个用户安全数据的数据源,并做为一个单一的复合用户“视图”。
8. 启用单点登陆(SSO)功能。内置了jasig-cas
9. 为没有关联到登陆的用户启用"Remember Me"服务。
市面主流的技术搭配
技术人员态度: 通吃才对!你们以为这个课程对你们有帮助吗?敬请关注,下一个文章告诉你们具体的代码实现方案!