Oauth2
OAuth2概念
OAuth2是目前最流行的授权协议,用来授权第三方应用,获取用户数据
令牌和密码的区别
令牌:
- 令牌是短期的,会自动失效
- 可以撤销,撤销立即生效
- 有权限范围,比如只能进 2号门
密码:
- 长期有效
- 一般不允许他人撤销
- 密码一般是完整权限
OAuth2 用来授权协议 java是用spring security auth框架实现
OAuth授权模式
- 授权码模式:最完整和严谨的授权模式,第三方平台登录都是此模式,安全性最高
- 简化模式:省略授权码阶段,客户端时纯静态页面采用,安全性较高
- 密码模式:把用户名密码告诉客户端,对客户端高度信任,比如客户端和认证服务器时同一个公司,安全性一般
- 客户端模式:直接以客户端名义申请令牌(很少用),安全性最差
几种Session方案
1.单体架构 cookie session机制
2.分布式架构方案:session共享
- session复制- 节点多的话会出问题
- session延连- 如果断开那么无法继续访问,不是高可用
- session共享- 目前主流session方案
3.基于token
为什么要用OAuth2
- cookie是不能跨域(域名、端口或协议不同)的,前后端分离分布式架构实现多系统SSO非常难
- 移动端应用没有cookie,所以对移动端支持不好
- token基于header传递,部分解决乐CSRF攻击
- token要比sessionID大,客户端存储再Local Storage中,可以直接JS读取
实战操作
工程结构
- 授权服务器:颁发和验证令牌
- 资源服务器:提供需要令牌才能访问的服务
项目依赖项:
spring-cloud-starter-oauth2
spring-cloud-starter-security
授权服务器配置
Oauth2配置类继承AuthorizationServerConfigurerAdapter,配置OAuth2相关参数
SpringSecurity配置类,继承WebSecurityConfigurerAdapter,实现SpringSecurity权限配置
资源服务器
OAuth2配置类继承AuthorizationServerConfigurerAdapter
Security配置类继承WebSecurityConfigurerAdapter
HelloController中定义了受限访问的资源