单点登录

1 . what?
SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一。

2.Why?
有些公司有多系统可以使用同一个账户登录,所以需要单点登录。

3.How?
全局Cookie 适用于同一域名或相同二级域名,无法同时登出,不安全
集中式Session
自定义的统一SSO中央服务器+Token

SSO技术选型

cas官方示例以javaWeb为准, 对微服务化应用,前后端分离应用,支持性较差
oauth2第三方登录授权, Security 提供
jwt (客户端token)Json web token (JWT), 该token被设计为紧凑且安全的,适用于单点登录
spring-securityspring-security 是spring家族的安全控制框架,它依赖于Servlet过滤器
shiroApache Shiro 是一个强大而灵活的开源安全框架

市面上一些主流的技术搭配:spring-security + oauth2(最佳方案) , spring-security + cas (功能较弱,对前后端分离项目支持不是很友好)shiro + cas(对前后端分离项目支持不友好,需要改造Cas服务端)
网关服务:auth-gateway,负责请求转发和鉴权功能。
认证中心:auth-server,OAuth2 主要实现端,Token 的生成、刷新、验证都在认证中心完成。
子服务:auth-o-server,微服务之一,接收到请求后会到认证中心验证。
客户端:例如 APP 端、web 端 等终端
框架使用springboot 、 springCloud 、 Security 采用Consul作为注册中心,getWay作为网关,使用auth-jwt,JWT库操作jwt令牌

单点登录流程图:
在这里插入图片描述
核心实现类:

在这里插入图片描述
实现步骤:
创建并配置认证服务端:配置最多的就是认证服务端,验证账号、密码,存储 token,检查 token ,刷新 token 等都是认证服务端的工作。
引入spring-cloud-starter-oauth2,用来实现单点登录。

spring security 基础配置,使用@EnableWebSecurity注解修饰,并继承自WebSecurityConfigurerAdapter类。

这个类的重点就是声明 PasswordEncoder 和 AuthenticationManager两个 Bean。其中 BCryptPasswordEncoder是一个密码加密工具类,它可以实现不可逆的加密,AuthenticationManager是为了实现 OAuth2 的 password 模式必须要指定的授权管理 Bean。

实现 UserDetailsService,它是实现用户身份验证的一种方式,UserDetailsService的核心就是loadUserByUsername方法它要接收一个字符串参数,也就是传过来的用户名,返回一个对象。

核心: OAuth2 配置文件,创建一个配置文件继承自AuthorizationServerConfigurerAdapter,有三个 configure 方法的重写。 authenticationManage()调用此方法才能支持 password 模式。 userDetailsService()设置用户验证服务。 tokenStore()指定 token 的存储方式。可以有两种实现方式, redisToken, JWT
在这里插入图片描述
添加 JwtConfig 配置类,JWT 有自己特殊的加密方式,可以有效的防止数据被篡改,只要不把用户密码等关键信息放到 JWT 里就可以保证安全性。

该配置类实现两个Bean类,JwtAccessTokenConverter 这个对象是用来做JWT数据转换,这JWT自身独有的数据格式
在OAuthConfig 配置类中注入 JWT 相关的 Bean方法为 JWT 存储模式。

注意:认证服务端JwtAccessTokenConverter设置的 SigningKey 要和配置文件中的 key-value 相同,不然会导致无法正常解码 JWT ,导致验证不通过。

搭建网关服务,它将作为Oauth2的资源服务、客户端服务使用,对访问微服务的请求进行统一的校验认证和鉴权操作。

在application.yml中添加相关配置,主要是路由规则的配置、Oauth2中的配置及路由白名单的配置

对网关服务进行配置安全配置,由于Gateway使用的是Hystrix,所有需要进行鉴权处理配置

全局过滤器GlobaException,当鉴权通过后将JWT令牌中的用户信息解析出来,然后存入请求的Header中,这样后续服务就不需要解析JWT令牌了,可以直接从请求的Header中获取到用户信息

使用SSO遇到的问题:
jsessionid问题 : jsessionid是java客户端与应用服务器维持session的一个标识,单点登录成功后,返回业务系统访问地址也带有jsessionid参数,这个在uri地址中看起来很不舒服

有些接口是不需要过滤器拦截的

不同单点服务器退出登录会返回不同的登录界面

CSRF跨域认证问题

接口演示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
子平台根据token验证用户key和secret正确以后,返回子应用token,用户拿到该token操作业务接口

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郭优秀的笔记

你的支持就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值