Spring Cloud OAUTH2认证鉴权的实现

1. 背景

最近在做权限相关服务的开发,在系统微服务化后,原有的单体应用是基于session的安全权限方式,不能满足现有的微服务架构的认证与鉴权需求。微服务架构下,一个应用会被拆分成若干个微应用,每个微应用都需要对访问进行鉴权,每个微应用都需要明确当前访问用户以及其权限。尤其当访问来源不只是浏览器,还包括其他服务的调用时,单体应用架构下的鉴权方式就不是特别合适了。在微服务架构下,要考虑外部应用接入的场景、用户–服务的鉴权、服务–服务的鉴权等多种鉴权场景。
比如用户A访问User Service,A如果未登录,则首先需要登录,请求获取授权token。获取token之后,A将携带着token去请求访问某个文件,这样就需要对A的身份进行校验,并且A可以访问该文件。
为了适应架构的变化、需求的变化,auth权限模块被单独出来作为一个基础的微服务系统,为其他业务service提供服务。

分布式应用简化版架构图如下:
Spring Cloud OAUTH2认证鉴权的实现_第1张图片

2. 技术方案及实现

(1)需求:其一是认证与鉴权,对于请求的用户身份的授权以及合法性鉴权;其二是API级别的操作权限控制,这个在第一点之后,当鉴定完用户身份合法之后,对于该用户的某个具体请求是否具有该操作执行权限进行校验。
(2)技术方案:
分布式Session方案
分布式会话方案原理主要是将关于用户认证的信息存储在共享存储中,且通常由用户会话作为 key 来实现的简单分布式哈希映射。当用户访问微服务时,用户数据可以从共享存储中获取。在某些场景下,这种方案很不错,用户登录状态是不透明的。同时也是一个高可用且可扩展的解决方案。这种方案的缺点在于共享存储需要一定保护机制,因此需要通过安全链接来访问,这时解决方案的实现就通常具有相当高的复杂性了。
基于OAuth2 Token方案
随着 Restful API、微服务的兴起,基于Token的认证现在已经越来越普遍。Token和Session ID 不同,并非只是一个 key。Token 一般会包含用户的相关信息,通过验证 Token 就可以完成身份校验。用户输入登录信息,发送到身份认证服务进行认证。AuthorizationServer验证登录信息是否正确,返回用户基础信息、权限范围、有效时间等信息,客户端存储接口。用户将 Token 放在 HTTP 请求头中,发起相关 API 调用。被调用的微服务,验证Token。ResourceServer返回相关资源和数据。
(3) oauth2根据使用场景不同,分成了4种模式:
授权码模式(authorization code)
简化模式(implicit)
密码模式(resource owner password credentials)
客户端模式(client credentials)
(4) 依赖:

    
    
        org.springframework.cloud
        spring-cloud-starter-oauth2
    

(5)主要步骤:
配置资源服务器
Spring Cloud OAUTH2认证鉴权的实现_第2张图片
配置认证服务器
Spring Cloud OAUTH2认证鉴权的实现_第3张图片
配置Spring Security
Spring Cloud OAUTH2认证鉴权的实现_第4张图片
接上图
Spring Cloud OAUTH2认证鉴权的实现_第5张图片
(6)提供的endpoint:
/oauth/token?grant_type=password #请求授权token

/oauth/token?grant_type=refresh_token #刷新token

/oauth/check_token #校验token

/logout #注销token及权限相关信息

(7)执行endpoint:
username和password是客户端提供给服务器进行校验用户身份信息。header里面的Authorization是存放的clientId和clientSecret经过Base64编码的字符串
Spring Cloud OAUTH2认证鉴权的实现_第6张图片
Spring Cloud OAUTH2认证鉴权的实现_第7张图片

Spring Cloud OAUTH2认证鉴权的实现_第8张图片
资源服务器的配置,覆写了默认的配置。为了支持logout,自定义了一个logoutSuccessHandler
Spring Cloud OAUTH2认证鉴权的实现_第9张图片
Spring Cloud OAUTH2认证鉴权的实现_第10张图片
Spring Cloud OAUTH2认证鉴权的实现_第11张图片

你可能感兴趣的:(JAVAWEB篇)