日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Spring Security如何優(yōu)雅的增加OAuth2協(xié)議授權(quán)模式

瀏覽:106日期:2023-08-15 18:35:52

一、什么是OAuth2協(xié)議?

OAuth 2.0 是一個關(guān)于授權(quán)的開放的網(wǎng)絡(luò)協(xié)議,是目前最流行的授權(quán)機制。

數(shù)據(jù)的所有者告訴系統(tǒng),同意授權(quán)第三方應(yīng)用進入系統(tǒng),獲取這些數(shù)據(jù)。系統(tǒng)從而產(chǎn)生一個短期的進入令牌(token),用來代替密碼,供第三方應(yīng)用使用。

由于授權(quán)的場景眾多,OAuth 2.0 協(xié)議定義了獲取令牌的四種授權(quán)方式,分別是:

授權(quán)碼模式:授權(quán)碼模式(authorization code)是功能最完整、流程最嚴密的授權(quán)模式。它的特點就是通過客戶端的后臺服務(wù)器,與'服務(wù)提供商'的認證服務(wù)器進行互動。 簡化模式:簡化模式(implicit grant type)不通過第三方應(yīng)用程序的服務(wù)器,直接在瀏覽器中向認證服務(wù)器申請令牌,跳過了'授權(quán)碼'這個步驟,因此得名。所有步驟在瀏覽器中完成,令牌對訪問者是可見的,且客戶端不需要認證。 密碼模式:密碼模式(Resource Owner Password Credentials Grant)中,用戶向客戶端提供自己的用戶名和密碼??蛻舳耸褂眠@些信息,向'服務(wù)商提供商'索要授權(quán)。 客戶端模式:客戶端模式(Client Credentials Grant)指客戶端以自己的名義,而不是以用戶的名義,向'服務(wù)提供商'進行認證。嚴格地說,客戶端模式并不屬于OAuth框架所要解決的問題。在這種模式中,用戶直接向客戶端注冊,客戶端以自己的名義要求'服務(wù)提供商'提供服務(wù),其實不存在授權(quán)問題。

四種授權(quán)模式分別使用不同的 grant_type 來區(qū)分

二、為什么要自定義授權(quán)類型?

雖然 OAuth2 協(xié)議定義了4種標準的授權(quán)模式,但是在實際開發(fā)過程中還是遠遠滿足不了各種變態(tài)的業(yè)務(wù)場景,需要我們?nèi)U展。

例如增加圖形驗證碼、手機驗證碼、手機號密碼登錄等等的場景

而常見的做法都是通過增加 過濾器Filter 的方式來擴展 Spring Security 授權(quán),但是這樣的實現(xiàn)方式有兩個問題:

脫離了 OAuth2 的管理 不靈活:例如系統(tǒng)使用 密碼模式 授權(quán),網(wǎng)頁版需要增加圖形驗證碼校驗,但是手機端APP又不需要的情況下,使用增加 Filter 的方式去實現(xiàn)就比較麻煩了。

所以目前在 Spring Security 中比較優(yōu)雅和靈活的擴展方式就是通過自定義 grant_type 來增加授權(quán)模式。

三、實現(xiàn)思路

在擴展之前首先需要先了解 Spring Security 的整個授權(quán)流程,我以 密碼模式 為例去展開分析,如下圖所示

Spring Security如何優(yōu)雅的增加OAuth2協(xié)議授權(quán)模式

3.1. 流程分析

整個授權(quán)流程關(guān)鍵點分為以下兩個部分:

第一部分:關(guān)于授權(quán)類型 grant_type 的解析

每種 grant_type 都會有一個對應(yīng)的 TokenGranter 實現(xiàn)類。 所有 TokenGranter 實現(xiàn)類都通過 CompositeTokenGranter 中的 tokenGranters 集合存起來。 然后通過判斷 grantType 參數(shù)來定位具體使用那個 TokenGranter 實現(xiàn)類來處理授權(quán)。

第二部分:關(guān)于授權(quán)登錄邏輯

每種 授權(quán)方式 都會有一個對應(yīng)的 AuthenticationProvider 實現(xiàn)類來實現(xiàn)。 所有 AuthenticationProvider 實現(xiàn)類都通過 ProviderManager 中的 providers 集合存起來。 TokenGranter 類會 new 一個 AuthenticationToken 實現(xiàn)類,如 UsernamePasswordAuthenticationToken 傳給 ProviderManager 類。 而 ProviderManager 則通過 AuthenticationToken 來判斷具體使用那個 AuthenticationProvider 實現(xiàn)類來處理授權(quán)。

具體的登錄邏輯由 AuthenticationProvider 實現(xiàn)類來實現(xiàn),如 DaoAuthenticationProvider。

3.2. 擴展分析

根據(jù)上面的流程,擴展分為以下兩種場景

場景一:只對原有的授權(quán)邏輯進行增強或者擴展,如:用戶名密碼登錄前增加圖形驗證碼校驗。

該場景需要定義一個新的 grantType 類型,并新增對應(yīng)的 TokenGranter 實現(xiàn)類 添加擴展內(nèi)容,然后加到 CompositeTokenGranter 中的 tokenGranters 集合里即可。

參考代碼:PwdImgCodeGranter.java

場景二:新加一種授權(quán)方式,如:手機號加密碼登錄。

該場景需要實現(xiàn)以下內(nèi)容:

定義一個新的 grantType 類型,并新增對應(yīng)的 TokenGranter 實現(xiàn)類添加到 CompositeTokenGranter 中的 tokenGranters 集合里 新增一個 AuthenticationToken 實現(xiàn)類,用于存放該授權(quán)所需的信息。 新增一個 AuthenticationProvider 實現(xiàn)類 實現(xiàn)授權(quán)的邏輯,并重寫 supports 方法綁定步驟二的 AuthenticationToken 實現(xiàn)類

參考代碼:MobilePwdGranter.java

四、代碼實現(xiàn)

下面以 場景二 新增手機號加密碼授權(quán)方式為例,展示核心的代碼實現(xiàn)

4.1. 創(chuàng)建 AuthenticationToken 實現(xiàn)類

創(chuàng)建 MobileAuthenticationToken 類,用于存儲手機號和密碼信息

public class MobileAuthenticationToken extends AbstractAuthenticationToken {private static final long serialVersionUID = SpringSecurityCoreVersion.SERIAL_VERSION_UID;private final Object principal;private Object credentials;public MobileAuthenticationToken(String mobile, String password) {super(null);this.principal = mobile;this.credentials = password;setAuthenticated(false);}public MobileAuthenticationToken(Object principal, Object credentials, Collection<? extends GrantedAuthority> authorities) {super(authorities);this.principal = principal;this.credentials = credentials;super.setAuthenticated(true);}@Overridepublic Object getCredentials() {return this.credentials;}@Overridepublic Object getPrincipal() {return this.principal;}@Overridepublic void setAuthenticated(boolean isAuthenticated) {if (isAuthenticated) {throw new IllegalArgumentException('Cannot set this token to trusted - use constructor which takes a GrantedAuthority list instead');}super.setAuthenticated(false);}@Overridepublic void eraseCredentials() {super.eraseCredentials();}}

4.2. 創(chuàng)建 AuthenticationProvider 實現(xiàn)類

創(chuàng)建 MobileAuthenticationProvider 類,實現(xiàn)登錄邏輯,并綁定 MobileAuthenticationToken 類

@Setterpublic class MobileAuthenticationProvider implements AuthenticationProvider { private ZltUserDetailsService userDetailsService; private PasswordEncoder passwordEncoder; @Override public Authentication authenticate(Authentication authentication) { MobileAuthenticationToken authenticationToken = (MobileAuthenticationToken) authentication; String mobile = (String) authenticationToken.getPrincipal(); String password = (String) authenticationToken.getCredentials(); UserDetails user = userDetailsService.loadUserByMobile(mobile); if (user == null) { throw new InternalAuthenticationServiceException('手機號或密碼錯誤'); } if (!passwordEncoder.matches(password, user.getPassword())) { throw new BadCredentialsException('手機號或密碼錯誤'); } MobileAuthenticationToken authenticationResult = new MobileAuthenticationToken(user, password, user.getAuthorities()); authenticationResult.setDetails(authenticationToken.getDetails()); return authenticationResult; } @Override public boolean supports(Class<?> authentication) { return MobileAuthenticationToken.class.isAssignableFrom(authentication); }}

4.3. 創(chuàng)建 TokenGranter 實現(xiàn)類

創(chuàng)建 MobilePwdGranter 類并定義 grant_type 的值為 mobile_password

public class MobilePwdGranter extends AbstractTokenGranter { private static final String GRANT_TYPE = 'mobile_password'; private final AuthenticationManager authenticationManager; public MobilePwdGranter(AuthenticationManager authenticationManager, AuthorizationServerTokenServices tokenServices , ClientDetailsService clientDetailsService, OAuth2RequestFactory requestFactory) { super(tokenServices, clientDetailsService, requestFactory, GRANT_TYPE); this.authenticationManager = authenticationManager; } @Override protected OAuth2Authentication getOAuth2Authentication(ClientDetails client, TokenRequest tokenRequest) { Map<String, String> parameters = new LinkedHashMap<>(tokenRequest.getRequestParameters()); String mobile = parameters.get('mobile'); String password = parameters.get('password'); parameters.remove('password'); Authentication userAuth = new MobileAuthenticationToken(mobile, password); ((AbstractAuthenticationToken) userAuth).setDetails(parameters); userAuth = authenticationManager.authenticate(userAuth); if (userAuth == null || !userAuth.isAuthenticated()) { throw new InvalidGrantException('Could not authenticate mobile: ' + mobile); } OAuth2Request storedOAuth2Request = getRequestFactory().createOAuth2Request(client, tokenRequest); return new OAuth2Authentication(storedOAuth2Request, userAuth); }}

4.4. 加到 CompositeTokenGranter 中的集合里

// 添加手機號加密碼授權(quán)模式tokenGranters.add(new MobilePwdGranter(authenticationManager, tokenServices, clientDetailsService, requestFactory));

4.5. 測試

使用以下地址,指定 grant_type 為 mobile_password 進行授權(quán)獲取 access_token

/oauth/token?grant_type=mobile_password&mobile={mobile}&password={password}

Spring Security如何優(yōu)雅的增加OAuth2協(xié)議授權(quán)模式

五、參考樣例

詳細的代碼實現(xiàn)可以參考

https://gitee.com/zlt2000/microservices-platform/tree/master/zlt-uaa

到此這篇關(guān)于Spring Security如何優(yōu)雅的增加OAuth2協(xié)議授權(quán)模式的文章就介紹到這了,更多相關(guān)Spring Security OAuth2內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
男女性色大片免费观看一区二区| 亚洲人成网77777色在线播放| 日韩久久99| 国产精品腿扒开做爽爽爽挤奶网站| 亚洲网站视频| 99视频精品免费观看| 狠狠久久婷婷| 久久不射网站| 亚洲色图国产| 国产日韩在线观看视频| 国产精品白丝久久av网站| 国产精品a级| 精品国产18久久久久久二百| 国产黄色精品| 福利片在线一区二区| av日韩中文| 亚洲a在线视频| 日韩午夜黄色| 日本91福利区| 黄色精品视频| 国产一区视频在线观看免费| 久久亚洲国产精品一区二区| 日韩va欧美va亚洲va久久| 美女精品视频在线| 久久国产直播| 亚洲欧洲av| 久久一区精品| 欧美中文字幕一区二区| 视频一区二区不卡| 国产情侣一区在线| 电影亚洲精品噜噜在线观看 | 综合国产视频| 国产乱码精品一区二区三区四区| 精品视频在线你懂得| 亚洲va中文在线播放免费| 樱桃成人精品视频在线播放| 日韩高清电影免费| av资源中文在线| 好吊日精品视频| 国产亚洲观看| 久久久精品久久久久久96| 蜜臀久久99精品久久久久久9| 日韩精品久久理论片| 久久精品三级| 91久久中文| 国产精品一区二区美女视频免费看| 日韩欧美1区| 亚州欧美在线| 久久久久蜜桃| 国产精品大片| 在线视频免费在线观看一区二区| 欧美精品福利| 激情综合网站| 欧美激情日韩| 首页国产欧美久久| 91日韩免费| 亚洲深深色噜噜狠狠爱网站 | 亚洲啊v在线| 免费精品视频最新在线| 国产不卡精品| 日韩中文字幕| 欧产日产国产精品视频| 日本一区二区三区中文字幕| 日韩一区三区| 91精品国产经典在线观看| 欧美日韩精品免费观看视欧美高清免费大片 | 日韩高清三区| 中文字幕在线视频网站| 综合国产精品| 精品日韩视频| 国产高清亚洲| 一区二区91| 婷婷中文字幕一区| 精品一区91| 婷婷精品在线观看| 91精品综合| 国产精品九九| 久久福利影视| 日韩在线二区| 精品国产网站| 国产图片一区| 亚洲久久一区| 国产美女一区| 欧美日韩中文一区二区| 国产suv精品一区二区四区视频| 视频一区中文字幕精品| 久久久久美女| аⅴ资源天堂资源库在线| 国产亚洲欧美日韩在线观看一区二区 | 久久婷婷久久| 国产a亚洲精品| 国产麻豆一区| 日韩影片在线观看| 免费久久99精品国产自在现线| 日韩在线二区| 亚洲国产福利| 国产成人调教视频在线观看| 国产精品亚洲片在线播放| 亚洲人亚洲人色久| 免费精品视频| 麻豆亚洲精品| 亚洲黄页一区| 在线成人直播| 激情久久久久久久| 久久久久国产一区二区| 国产一区二区三区黄网站| 国产欧美高清视频在线| 日本成人中文字幕在线视频| 蜜臀av一区二区三区| 黄色成人精品网站| 成人自拍av| 免费在线小视频| 久久久国产亚洲精品| 久久久影院免费| 亚洲手机视频| 夜夜嗨网站十八久久| 欧美日韩国产综合网| 欧美粗暴jizz性欧美20| 久久久影院免费| 在线精品视频在线观看高清| 午夜久久99| 蜜桃久久av| 日韩精品中文字幕一区二区| 日韩国产91| 国产日韩精品视频一区二区三区| 日本免费一区二区视频| 欧美一区激情| 国产精品毛片久久久| 久久尤物视频| 中文字幕成在线观看| 久久精品电影| 黄色日韩在线| 每日更新成人在线视频| 四虎成人精品一区二区免费网站| 91精品国产自产精品男人的天堂 | 奇米色欧美一区二区三区| 亚洲91在线| 国产伦精品一区二区三区在线播放 | 国内精品麻豆美女在线播放视频| 精品网站999| 中文字幕成在线观看| 亚洲欧美一区在线| 视频一区二区欧美| 国产精品最新| 在线亚洲人成| 好看的av在线不卡观看| 亚洲久久在线| 国产精品久久久久久模特 | 久久裸体视频| 亚洲一区激情| 在线观看亚洲精品福利片| 日韩av一区二| 精品少妇一区| 亚洲网站视频| 午夜精品影视国产一区在线麻豆| 国产精品115| 日韩和的一区二在线| 野花国产精品入口| 欧美三级第一页| av资源亚洲| 中国女人久久久| 国产精品一卡| 欧美日韩一区二区三区视频播放| 亚洲九九精品| 麻豆成全视频免费观看在线看| 国产一区日韩一区| 日韩1区2区3区| 精品国产第一福利网站| 噜噜噜躁狠狠躁狠狠精品视频 | 高清av一区| 国产精品日韩久久久| 国产亚洲一区二区三区不卡| 午夜av不卡| 天堂va欧美ⅴa亚洲va一国产| 91视频精品| 婷婷精品在线观看| 视频福利一区| 国产精品最新自拍| 91精品蜜臀一区二区三区在线| 亚洲v天堂v手机在线| 日韩伦理一区| 91麻豆精品激情在线观看最新| 久久三级视频| 国产欧美日韩免费观看| 激情视频一区二区三区| 国产探花一区在线观看| 亚洲第一精品影视| 国产视频网站一区二区三区| 午夜欧美精品| 国产一区二区三区亚洲综合| 免费人成在线不卡| 欧产日产国产精品视频| 日韩激情综合| 欧美性感美女一区二区| 国产伦一区二区三区| 亚洲一区日韩在线| 欧美xxxx中国| 欧美精品观看| 亚洲永久精品唐人导航网址| 日本精品影院|