多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# :-: 服务认证授权架构设计 :-: Spring Cloud Security Oauth2.0 jwt * 什么是认证中心 身份认证,就是判断一个用户是否为合法用户的处理过程。最常用的简单身份认证方式是系统通过核对用户输入的用户名和口令,看其是否与系统中存储的该用户的用户名和口令一致,来判断用户身份是否正确。 * 为什么要使用认证中心 登录请求后台接口,为了安全认证,所有请求都携带`token`信息进行安全认证,比如使用`vue`、`react`后者`h5`开发的`app`,用于控制可访问系统的资源。 :-: :-: Spring 提供的 Spring Security oAuth2 能搭建一套验证授权及资源访问服务,帮助大家在实现企业微服务架构时能够有效的控制多个服务的统一登录、授权及资源保护工作。 ### 什么是OAuth2? OAuth2是一个关于授权的开放标准,核心思路是通过各类认证手段(具体什么手段OAuth2不关心)认证用户身份,并颁发token(令牌),使得第三方应用可以使用该令牌在**限定时间**、**限定范围**访问指定资源。获取令牌的方式主要有四种,分别是`授权码模式`,`简单模式`,`密码模式`和`客户端模式` 这里要先明确几个OAuth2中的几个重要概念: * `resource owner`: 拥有被访问资源的用户 * `user-agent`: 一般来说就是浏览器 * `client`: 第三方应用 * `Authorization server`: 认证服务器,用来进行用户认证并颁发token * `Resource server`:资源服务器,拥有被访问资源的服务器,需要通过token来确定是否有权限访问 ### 什么是Spring Security? Spring Security是一套安全框架,可以基于RBAC(基于角色的权限控制)对用户的访问权限进行控制,核心思想是通过一系列的filter chain来进行拦截过滤。 ### 认证与授权(Authentication and Authorization) 一般意义来说的应用访问安全性,都是围绕认证(Authentication)和授权(Authorization)这两个核心概念来展开的。即首先需要确定用户身份,在确定这个用户是否有访问指定资源的权限。认证这块的解决方案很多,主流的有`CAS`、`SAML2`、`OAUTH2`等,我们常说的单点登录方案(SSO)说的就是这块,授权的话主流的就是spring security和shiro。 ### JWT介绍 JWT全称为Json Web Token 由三部分组成 。第一部分我们称它为头部(header),第二部分我们称其为载荷(payload, 类似于飞机上承载的物品),第三部分是签证(signature)。如下eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ ### header jwt的头部承载两部分信息: * 声明类型,这里是jwt * 声明加密的算法 通常直接使用 HMAC SHA256 完整的头部就像下面这样的JSON: ~~~bash { 'typ': 'JWT', 'alg': 'HS256' } ~~~ ### playload 载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分 * 标准中注册的声明 * 公共的声明 * 私有的声明 **标准中注册的声明** (建议但不强制使用) : * **iss**: jwt签发者 * **sub**: jwt所面向的用户 * **aud**: 接收jwt的一方 * **exp**: jwt的过期时间,这个过期时间必须要大于签发时间 * **nbf**: 定义在什么时间之前,该jwt都是不可用的. * **iat**: jwt的签发时间 * **jti**: jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。 ### signature jwt的第三部分是一个签证信息,这个签证信息由三部分组成: * header (base64后的) * payload (base64后的) * secret 这个部分需要base64加密后的header和base64加密后的payload使用`.`连接组成的字符串,然后通过header中声明的加密方式进行加盐`secret`组合加密,然后就构成了jwt的第三部分