微服务认证与授权 Spring Security:总体介绍

这是我参与更文挑战的第 28 天,活动详情查看: 更文挑战

对于一个服务系统,安全是必须需要考虑的方面。应用安全是一个不断追求更强的目标,全面性、全系统的方法很重要,因为开发者永远不知道入侵者是如何对系统进行攻击。在系统安全的实现上,一般倡导使用安全层layers of security,即多层次安全保证,通过连续层提供额外的安全性。每一层的安全性越强,应用程序的健壮性和安全性就越高。Java EE应用程序位于安全层的高层次,需要为它添加特定的问题域安全配置。

安全关注两个方面

对应用的层次的安全主要关注两个方面,认证(Authentication)和授权(Authoriztion),即你是谁,以及你能做什么。在单体应用中,开发者可以通过简单的拦截器以及session机制对用户的访问进行控制和记录。在分布式系统中,由于业务逻辑封装在各个微服务中,每个微服务都需要对用户的行为进行认证和许可,于是就产生了两种可能的方式:

  • 第一种是通过一个中心化的权限管理系统,对用户的身份和权限进行统一的管理,可以做到一次授权,多次多点使用,但是这个独立的安全微服务需要聚合各个微服务中的权限控制逻辑,多一个基于不同业务逻辑实现的微服务可能需要在安全微服务中添加新的实现;
  • 第二种是将安全部分分散到各个微服务中,由各个微服务根据自身的业务对用户的访问进行管理和控制,这会导致安全管理过于分散,甚至每个微服务都有自己的一套实现方式,不利于统一管理。这两种方式都有利有弊,如何选择需要根据项目的具体需求进行宏观判断,甚至在一定情况下可以结合使用。

虽然spring-cloud-security文档中对其使用提供的帮助不多,但是通过对spring-security与spring-security-oauth2的相关使用以及探索,将有助开发者通过spring-cloud-security构建高健壮的安全应用。

在开始对相关的应用以及源码的介绍之前,需要对部分前置知识进行一定的补充,如OAuth2以及JWT。

OAuth2 简介

OAuth2相关理论的介绍主要来自于OAuth2官方文档,相关地址为https://tools.ietf.org/html/rfc6749

OAuth协议的目的是为了为用户资源的授权提供一个安全的、开放而简易的标准。官网中的介绍如下:

An open protocol to allow secure API authorization in a simple and standard method from web, mobile and desktop applications.

OAuth1由于不被OAuth2兼容,且签名逻辑过于复杂和授权流程的过于单一,在此不过多谈论,以下重点关注OAuth2认证流程,它是当前Web应用中的主流授权流程。

OAuth2 中的概念

OAuth2是当前授权的行业标准,其重点在于为Web应用程序、桌面应用程序、移动设备以及室内设备的授权流程提供简单的客户端开发方式。它为第三方应用提供对HTTP服务的有限访问,既可以是资源拥有者通过授权允许第三方应用获取HTTP服务,也可以是第三方以自己的名义获取访问权限。

角色

OAuth2 中主要分为了4种角色

  • resource owner 资源所有者,是能够对受保护的资源授予访问权限的实体,可以是一个用户,这时会被称为end-user。
  • resource server 资源服务器,持有受保护的资源,允许持有访问令牌(access token)的请求访问受保护资源。
  • client 客户端,持有资源所有者的授权,代表资源所有者对受保护资源进行访问。
  • authorization server 授权服务器,对资源所有者的授权进行认证,成功后向客户端发送访问令牌。

在很多时候,资源服务器和授权服务器是合二为一的,在授权交互的时候是授权服务器,在请求资源交互是资源服务器。但是授权服务器是单独的实体,它可以发出被多个资源服务器接受的访问令牌。

协议流程

首先看一张来自官方提供的流程图:

 +--------+                               +---------------+
 |        |--(1)- Authorization Request ->|   Resource    |
 |        |                               |     Owner     |
 |        |<-(2)-- Authorization Grant ---|               |
 |        |                               +---------------+
 |        |
 |        |                               +---------------+
 |        |--(3)-- Authorization Grant -->| Authorization |
 | Client |                               |     Server    |
 |        |<-(4)----- Access Token -------|               |
 |        |                               +---------------+
 |        |
 |        |                               +---------------+
 |        |--(5)----- Access Token ------>|    Resource   |
 |        |                               |     Server    |
 |        |<-(6)--- Protected Resource ---|               |
 +--------+                               +---------------+
复制代码

这是一张关于OAuth2角色的抽象交互流程图,主要包含以下的6个步骤:

  1. 客户端请求资源所有者的授权;
  2. 资源所有者同意授权,返回授权许可(Authorization Grant),这代表了资源所有者的授权凭证;
  3. 客户端携带授权许可要求授权服务器进行认证,请求访问令牌;
  4. 授权服务器对客户端进行身份验证,并认证授权许可,如果有效,返回访问令牌;
  5. 客户端携带访问许可向资源服务器请求受保护资源的访问;
  6. 资源服务器验证访问令牌,如果有效,接受访问请求,返回受保护资源。

小结

本文主要对 Spring Security 进行了总体介绍。spring-cloud-security提供了一组基本的组件用来构建安全应用程序和服务。它封装了spring-securtiy和spring-security-oauth2以及spring-securtiy-jwt的相关实现,同时提供自带的安全特性,致力于为spring-cloud中微服务提供快速创建常用的安全模式的能力。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享