电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Spring Security如何優雅的增加OAuth2協議授權模式

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

一、什么是OAuth2協議?

OAuth 2.0 是一個關于授權的開放的網絡協議,是目前最流行的授權機制。

數據的所有者告訴系統,同意授權第三方應用進入系統,獲取這些數據。系統從而產生一個短期的進入令牌(token),用來代替密碼,供第三方應用使用。

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

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

四種授權模式分別使用不同的 grant_type 來區分

二、為什么要自定義授權類型?

雖然 OAuth2 協議定義了4種標準的授權模式,但是在實際開發過程中還是遠遠滿足不了各種變態的業務場景,需要我們去擴展。

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

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

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

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

三、實現思路

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

Spring Security如何優雅的增加OAuth2協議授權模式

3.1. 流程分析

整個授權流程關鍵點分為以下兩個部分:

第一部分:關于授權類型 grant_type 的解析

每種 grant_type 都會有一個對應的 TokenGranter 實現類。 所有 TokenGranter 實現類都通過 CompositeTokenGranter 中的 tokenGranters 集合存起來。 然后通過判斷 grantType 參數來定位具體使用那個 TokenGranter 實現類來處理授權。

第二部分:關于授權登錄邏輯

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

具體的登錄邏輯由 AuthenticationProvider 實現類來實現,如 DaoAuthenticationProvider。

3.2. 擴展分析

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

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

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

參考代碼:PwdImgCodeGranter.java

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

該場景需要實現以下內容:

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

參考代碼:MobilePwdGranter.java

四、代碼實現

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

4.1. 創建 AuthenticationToken 實現類

創建 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. 創建 AuthenticationProvider 實現類

創建 MobileAuthenticationProvider 類,實現登錄邏輯,并綁定 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. 創建 TokenGranter 實現類

創建 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 中的集合里

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

4.5. 測試

使用以下地址,指定 grant_type 為 mobile_password 進行授權獲取 access_token

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

Spring Security如何優雅的增加OAuth2協議授權模式

五、參考樣例

詳細的代碼實現可以參考

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

到此這篇關于Spring Security如何優雅的增加OAuth2協議授權模式的文章就介紹到這了,更多相關Spring Security OAuth2內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 苏州防水公司_厂房屋面外墙防水_地下室卫生间防水堵漏-苏州伊诺尔防水工程有限公司 | CXB船用变压器-JCZ系列制动器-HH101船用铜质开关-上海永上船舶电器厂 | 深圳市东信高科自动化设备有限公司 | 中空玻璃生产线,玻璃加工设备,全自动封胶线,铝条折弯机,双组份打胶机,丁基胶/卧式/立式全自动涂布机,玻璃设备-山东昌盛数控设备有限公司 | 云南丰泰挖掘机修理厂-挖掘机维修,翻新,再制造的大型企业-云南丰泰工程机械维修有限公司 | 工控机,嵌入式主板,工业主板,arm主板,图像采集卡,poe网卡,朗锐智科 | 皮带式输送机械|链板式输送机|不锈钢输送机|网带输送机械设备——青岛鸿儒机械有限公司 | 干式变压器厂_干式变压器厂家_scb11/scb13/scb10/scb14/scb18干式变压器生产厂家-山东科锐变压器有限公司 | 天津暖气片厂家_钢制散热器_天津铜铝复合暖气片_维尼罗散热器 | 成都办公室装修-办公室设计-写字楼装修设计-厂房装修-四川和信建筑装饰工程有限公司 | 干洗加盟网-洗衣店品牌排行-干洗设备价格-干洗连锁加盟指南 | 高楼航空障碍灯厂家哪家好_航空障碍灯厂家_广州北斗星障碍灯有限公司 | 铝扣板-铝方通-铝格栅-铝条扣板-铝单板幕墙-佳得利吊顶天花厂家 elisa试剂盒价格-酶联免疫试剂盒-猪elisa试剂盒-上海恒远生物科技有限公司 | 【365公司转让网】公司求购|转让|资质买卖_股权转让交易平台 | 电机保护器-电动机综合保护器-上海硕吉电器有限公司 | 电磁铁_推拉电磁铁_机械手电磁吸盘电磁铁厂家-广州思德隆电子公司 | 磁力去毛刺机_去毛刺磁力抛光机_磁力光饰机_磁力滚抛机_精密金属零件去毛刺机厂家-冠古科技 | 阻垢剂,反渗透阻垢剂,缓蚀阻垢剂-山东普尼奥水处理科技有限公司 真空粉体取样阀,电动楔式闸阀,电动针型阀-耐苛尔(上海)自动化仪表有限公司 | 电位器_轻触开关_USB连接器_广东精密龙电子科技有限公司 | 河南卓美创业科技有限公司-河南卓美防雷公司-防雷接地-防雷工程-重庆避雷针-避雷器-防雷检测-避雷带-避雷针-避雷塔、机房防雷、古建筑防雷等-山西防雷公司 | 篮球地板厂家_舞台木地板品牌_体育运动地板厂家_凯洁地板 | 玉米深加工设备-玉米深加工机械-新型玉米工机械生产厂家-河南粮院机械制造有限公司 | 小型高低温循环试验箱-可程式高低温湿热交变试验箱-东莞市拓德环境测试设备有限公司 | 艾默生变频器,艾默生ct,变频器,ct驱动器,广州艾默生变频器,供水专用变频器,风机变频器,电梯变频器,艾默生变频器代理-广州市盟雄贸易有限公司官方网站-艾默生变频器应用解决方案服务商 | 缓蚀除垢剂_循环水阻垢剂_反渗透锅炉阻垢剂_有机硫化物-郑州威大水处理材料有限公司 | 蒜肠网-动漫,二次元,COSPLAY,漫展以及收藏型模型,手办,玩具的新媒体.(原变形金刚变迷TF圈) | SMC-SMC电磁阀-日本SMC气缸-SMC气动元件展示网 | 成都治疗尖锐湿疣比较好的医院-成都治疗尖锐湿疣那家医院好-成都西南皮肤病医院 | 缠膜机|缠绕包装机|无纺布包装机-济南达伦特机械设备有限公司 | 全自动过滤器_反冲洗过滤器_自清洗过滤器_量子除垢环_量子环除垢_量子除垢 - 安士睿(北京)过滤设备有限公司 | Brotu | 关注AI,Web3.0,VR/AR,GPT,元宇宙区块链数字产业 | ★店家乐|服装销售管理软件|服装店收银系统|内衣店鞋店进销存软件|连锁店管理软件|收银软件手机版|会员管理系统-手机版,云版,App | 福建珂朗雅装饰材料有限公司「官方网站」 | 上海公司注册-代理记账-招投标审计-上海昆仑扇财税咨询有限公司 上海冠顶工业设备有限公司-隧道炉,烘箱,UV固化机,涂装设备,高温炉,工业机器人生产厂家 | 【电子厂招聘_普工招工网_工厂招聘信息平台】-工立方打工网 | 不锈钢管件(不锈钢弯头,不锈钢三通,不锈钢大小头),不锈钢法兰「厂家」-浙江志通管阀 | 水篦子|雨篦子|镀锌格栅雨水篦子|不锈钢排水篦子|地下车库水箅子—安平县云航丝网制品厂 | 耐酸碱胶管_耐腐蚀软管总成_化学品输送软管_漯河利通液压科技耐油耐磨喷砂软管|耐腐蚀化学软管 | 哈希PC1R1A,哈希CA9300,哈希SC4500-上海鑫嵩实业有限公司 | 振动传感器,检波器-威海广达勘探仪器有限公司 | 喷砂机厂家_自动喷砂机生产_新瑞自动化喷砂除锈设备 |