日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

基于 Spring Security OAuth2和 JWT 构建保护微服务系统

發(fā)布時(shí)間:2024/2/28 windows 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于 Spring Security OAuth2和 JWT 构建保护微服务系统 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

我們希望自己的微服務(wù)能夠在用戶登錄之后才可以訪問,而單獨(dú)給每個(gè)微服務(wù)單獨(dú)做用戶權(quán)限模塊就顯得很弱了,從復(fù)用角度來說是需要重構(gòu)的,從功能角度來說,也是欠缺的。尤其是前后端完全分離之后,我們的用戶信息不一定存在于 Session 會(huì)話中。

?

應(yīng)用場景

常見的應(yīng)用場景如下圖,用戶通過瀏覽器進(jìn)行登錄,一旦確定用戶名和密碼正確,那么在服務(wù)器端使用秘鑰創(chuàng)建 JWT,并且返回給瀏覽器;接下來我們的請(qǐng)求需要在頭部增加 jwt 信息,服務(wù)器端進(jìn)行解密獲取用戶信息,然后進(jìn)行其他業(yè)務(wù)邏輯處理,再返回客戶端

?

?

什么是OAuth2?

OAuth2是一個(gè)關(guān)于授權(quán)的開放標(biāo)準(zhǔn),核心思路是通過各類認(rèn)證手段(具體什么手段OAuth2不關(guān)心)認(rèn)證用戶身份,并頒發(fā)token(令牌),使得第三方應(yīng)用可以使用該令牌在限定時(shí)間限定范圍訪問指定資源。主要涉及的RFC規(guī)范有RFC6749(整體授權(quán)框架),RFC6750(令牌使用),RFC6819(威脅模型)這幾個(gè),一般我們需要了解的就是RFC6749。獲取令牌的方式主要有四種,分別是授權(quán)碼模式,簡單模式,密碼模式和客戶端模式,如何獲取token不在本篇文章的討論范圍,我們這里假定客戶端已經(jīng)通過某種方式獲取到了access_token,想了解具體的oauth2授權(quán)步驟可以移步阮一峰老師的理解OAuth 2.0,里面有非常詳細(xì)的說明。

這里要先明確幾個(gè)OAuth2中的幾個(gè)重要概念:

  • resource owner: 擁有被訪問資源的用戶

  • user-agent: 一般來說就是瀏覽器

  • client: 第三方應(yīng)用

  • Authorization server: 認(rèn)證服務(wù)器,用來進(jìn)行用戶認(rèn)證并頒發(fā)token

  • Resource server:資源服務(wù)器,擁有被訪問資源的服務(wù)器,需要通過token來確定是否有權(quán)限訪問

明確概念后,就可以看OAuth2的協(xié)議握手流程,摘自RFC6749

?

什么是Spring Security?

Spring Security是一套安全框架,可以基于RBAC(基于角色的權(quán)限控制)對(duì)用戶的訪問權(quán)限進(jìn)行控制,核心思想是通過一系列的filter chain來進(jìn)行攔截過濾,以下是ss中默認(rèn)的內(nèi)置過濾器列表,當(dāng)然你也可以通過custom-filter來自定義擴(kuò)展filter chain列表

AliasFilter ClassNamespace Element or Attribute
CHANNEL_FILTERChannelProcessingFilterhttp/intercept-url@requires-channel
SECURITY_CONTEXT_FILTERSecurityContextPersistenceFilterhttp
CONCURRENT_SESSION_FILTERConcurrentSessionFiltersession-management/concurrency-control
HEADERS_FILTERHeaderWriterFilterhttp/headers
CSRF_FILTERCsrfFilterhttp/csrf
LOGOUT_FILTERLogoutFilterhttp/logout
X509_FILTERX509AuthenticationFilterhttp/x509
PRE_AUTH_FILTERAbstractPreAuthenticatedProcessingFilterN/A
CAS_FILTERCasAuthenticationFilterN/A
FORM_LOGIN_FILTERUsernamePasswordAuthenticationFilterhttp/form-login
BASIC_AUTH_FILTERBasicAuthenticationFilterhttp/http-basic
SERVLET_API_SUPPORT_FILTERSecurityContextHolderAwareRequestFilterhttp/@servlet-api-provision
JAAS_API_SUPPORT_FILTERJaasApiIntegrationFilterhttp/@jaas-api-provision
REMEMBER_ME_FILTERRememberMeAuthenticationFilterhttp/remember-me
ANONYMOUS_FILTERAnonymousAuthenticationFilterhttp/anonymous
SESSION_MANAGEMENT_FILTERSessionManagementFiltersession-management
EXCEPTION_TRANSLATION_FILTERExceptionTranslationFilterhttp
FILTER_SECURITY_INTERCEPTORFilterSecurityInterceptorhttp
SWITCH_USER_FILTERSwitchUserFilterN/A

這里面最核心的就是FILTER_SECURITY_INTERCEPTOR,通過FilterInvocationSecurityMetadataSource來進(jìn)行資源權(quán)限的匹配,AccessDecisionManager來執(zhí)行訪問策略。

認(rèn)證與授權(quán)(Authentication and Authorization)

一般意義來說的應(yīng)用訪問安全性,都是圍繞認(rèn)證(Authentication)和授權(quán)(Authorization)這兩個(gè)核心概念來展開的。即首先需要確定用戶身份,在確定這個(gè)用戶是否有訪問指定資源的權(quán)限。認(rèn)證這塊的解決方案很多,主流的有CAS、SAML2、OAUTH2等(不巧這幾個(gè)都用過-_-),我們常說的單點(diǎn)登錄方案(SSO)說的就是這塊,授權(quán)的話主流的就是spring security和shiro。shiro我沒用過,據(jù)說是比較輕量級(jí),相比較而言spring security確實(shí)架構(gòu)比較復(fù)雜。

?

OAuth2與SSO

首先要明確一點(diǎn),OAuth2并不是一個(gè)SSO框架,但可以實(shí)現(xiàn)SSO功能

所以總結(jié)一下就是:通過將用戶信息這個(gè)資源設(shè)置為被保護(hù)資源,可以使用OAuth2技術(shù)實(shí)現(xiàn)單點(diǎn)登陸(SSO),而Spring Security OAuth2就是這種OAuth2 SSO方案的一個(gè)實(shí)現(xiàn)。

?

JWT介紹

終于來到了著名的JWT部分了,JWT全稱為Json Web Token,最近隨著微服務(wù)架構(gòu)的流行而越來越火,號(hào)稱新一代的認(rèn)證技術(shù)。今天我們就來看一下,jwt的本質(zhì)到底是什么。

我們先來看一下OAuth2的token技術(shù)有沒有什么痛點(diǎn),相信從之前的介紹中你也發(fā)現(xiàn)了,token技術(shù)最大的問題是不攜帶用戶信息,且資源服務(wù)器無法進(jìn)行本地驗(yàn)證,每次對(duì)于資源的訪問,資源服務(wù)器都需要向認(rèn)證服務(wù)器發(fā)起請(qǐng)求,一是驗(yàn)證token的有效性,二是獲取token對(duì)應(yīng)的用戶信息。如果有大量的此類請(qǐng)求,無疑處理效率是很低的,且認(rèn)證服務(wù)器會(huì)變成一個(gè)中心節(jié)點(diǎn),對(duì)于SLA和處理性能等均有很高的要求,這在分布式架構(gòu)下是很要命的。

JWT就是在這樣的背景下誕生的,從本質(zhì)上來說,jwt就是一種特殊格式的token。普通的oauth2頒發(fā)的就是一串隨機(jī)hash字符串,本身無意義,而jwt格式的token是有特定含義的,分為三部分:

  • 頭部Header

  • 載荷Payload

  • 簽名Signature

這三部分均用base64進(jìn)行編碼,當(dāng)中用.進(jìn)行分隔,一個(gè)典型的jwt格式的token類似xxxxx.yyyyy.zzzzz。關(guān)于jwt格式的更多具體說明,不是本文討論的重點(diǎn),大家可以直接去官網(wǎng)查看官方文檔,這里不過多贅述。

jwt相對(duì)于傳統(tǒng)的token來說,解決以下兩個(gè)痛點(diǎn):

  • 通過驗(yàn)證簽名,token的驗(yàn)證可以直接在本地完成,不需要連接認(rèn)證服務(wù)器

  • 在payload中可以定義用戶相關(guān)信息,這樣就輕松實(shí)現(xiàn)了token和用戶信息的綁定

在上面的那個(gè)資源服務(wù)器和認(rèn)證服務(wù)器分離的例子中,如果認(rèn)證服務(wù)器頒發(fā)的是jwt格式的token,那么資源服務(wù)器就可以直接自己驗(yàn)證token的有效性并綁定用戶,這無疑大大提升了處理效率且減少了單點(diǎn)隱患。

JWT適用場景與不適用場景

JWT的使用上現(xiàn)在也有一種誤區(qū),認(rèn)為傳統(tǒng)的認(rèn)證方式都應(yīng)該被jwt取代。事實(shí)上,jwt也不能解決一切問題,它也有適用場景和不適用場景。

適用場景:

  • 一次性的身份認(rèn)證

  • api的鑒權(quán)

這些場景能充分發(fā)揮jwt無狀態(tài)以及分布式驗(yàn)證的優(yōu)勢

不適用的場景:

  • 傳統(tǒng)的基于session的用戶會(huì)話保持

不要試圖用jwt去代替session。這種模式下其實(shí)傳統(tǒng)的session+cookie機(jī)制工作的更好,jwt因?yàn)槠錈o狀態(tài)和分布式,事實(shí)上只要在有效期內(nèi),是無法作廢的,用戶的簽退更多是一個(gè)客戶端的簽退,服務(wù)端token仍然有效,你只要使用這個(gè)token,仍然可以登陸系統(tǒng)。另外一個(gè)問題是續(xù)簽問題,使用token,無疑令續(xù)簽變得十分麻煩,當(dāng)然你也可以通過redis去記錄token狀態(tài),并在用戶訪問后更新這個(gè)狀態(tài),但這就是硬生生把jwt的無狀態(tài)搞成有狀態(tài)了,而這些在傳統(tǒng)的session+cookie機(jī)制中都是不需要去考慮的。這種場景下,考慮高可用,我更加推薦采用分布式的session機(jī)制,現(xiàn)在已經(jīng)有很多的成熟框架可供選擇了(比如spring session)。

?

基于Spring Security OAuth2和JWT構(gòu)建保護(hù)微服務(wù)系統(tǒng)

本工程代碼是基于簡書一文基于 Spring Security OAuth2和 JWT 構(gòu)建保護(hù)微服務(wù)系統(tǒng)所編寫的。

目錄說明

  • ljl-architecture-spring-cloud 基于Dalston.SR5版本Spring Cloud + 1.5.13.RELEASE版本Spring Boot去構(gòu)建。

  • ljl-architecture-spring-cloud2 基于Finchley.SR2版本Spring Cloud + 2.0.8.RELEASE版本Spring Boot構(gòu)建。

  • ?

    github地址:

    https://github.com/leslie-1994/spring-security-oauth2-jwt-demo

    總結(jié)

    以上是生活随笔為你收集整理的基于 Spring Security OAuth2和 JWT 构建保护微服务系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。