第三方集成站點帶token訪問SpringSecurity應用站點自動登錄方案

近期有個WEB項目需要改造。業主找第三方搞了一個集成站點,將多個應用站點的鏈接集中放在一個導航頁面。由于進入集成站點時已經登錄過了,業主要求點擊這些應用站點的鏈接時就不必再登錄。

以前做過類似項目,用的是單點登錄。大家都用同一個登錄系統,一次登錄,到處同行,不亦快哉。不過也有一些缺點,一是單點登錄比較復雜,不好搞。之前我們用過一個開源的單點登錄系統cas,代碼一大堆,部署也很復雜,然后每個使用它的應用都要有個客戶端,總之非常復雜。出了問題也不知道是哪里的毛病。最常見的現象就是多次重定向,用戶登錄信息在客戶端和服務器之間無限被踢皮球。所以每次想到要用這個東東都心煩意亂,甚至嚇得面無人色。(詳見拙作:《21世紀應用開源單點登錄項目CAS之集大成者》)

這還不是最壞的。最大的問題是,使用單點登錄,勢必要維護共同的用戶信息,要么是所有系統都使用同一個用戶表,要么是大家同步用戶信息。不同的應用系統通常由不同的公司開發,每個都有自己的設計,現在要集成在一起,改造工作量可想而知。有些年代久遠,早就過維護期,想改造都不可能。

一、自動登錄方案

但這次沒有使用單點登錄。第三方公司給出了一個方案:
1)在集成站點的導航頁面點擊應用站點鏈接時,系統分配一個token;
2)應用站點可以訪問集成站點的接口對token進行驗證,并獲取對應的用戶信息。這些用戶信息是集成站點的,應用系統不一定有;
3)token驗證通過后,應用站點就可以自己決定是否讓他登錄本系統了。

這種思想,有點類似auth。auth是第三方驗證通過后就自動放行了,而這里的方案是,接下來還要應用系統自己做一些處理,即如何在本系統里放行。

這個方案的好處是,不一定要擁有相同的用戶信息。如果要求不嚴格,應用系統驗證帶過來的token后就可以用一個默認的賬號自動登錄;如果非要是同一個賬號,那么因為驗證token的時候會返回用戶信息,應用系統完全可以之同步到自己的庫里。所以這個方案比較靈活,應用系統的主動權較大,修改工作量比較小,難度也較小。人家有高手啊。

二、應用系統的實現

我們系統采用java開發,安全框架是Spring Security。我的思路是:
1)訪問本應用系統時,檢查有無帶上第三方token,有則執行第2步,無則轉向本系統的登錄頁面
2)驗證第三方token合法,則系統自動登錄,否則轉向本系統的登錄頁面

關鍵是如何自動登錄。

我從前端的登錄頁面,按圖索驥,發現登錄按鈕點擊后,會提交到后端的“/auth/token”。但是我找來找去,都找不到對應的代碼。后端用的這個框架我不熟悉,一問才知,/auth/token是Spring Security自己的實現。這個接口訪問后,會返回一個json對象,里面有個關鍵元素,叫“access_token”,我們前端就是憑這個來認定是否已經登錄了本系統的。

很自然地,我要在系統里實現自動登錄,那我應該創建并返回這個access_token給前端。問題是,這個創建過程是黑箱,我搞來搞去,都生成不了類似的令牌。最后放棄了,何必自己去搞,系統模擬前端提交,訪問一下自己這個/auth/token不就好了嗎?代碼如下:

	@GetMapping(value = "/autoLogin")public String autoLogin(@RequestParam(value="token3") String token3) {return autoLoginService.autoLogin(token3);}
 @Overridepublic String autoLogin(String token3) {//token3,第三方tokenString re = null;if(checkToken3(token3)) {re = login();} else {re = "token未經授權";}return re;}private boolean checkToken3(String token) {boolean ok = false;//checkUrl,驗證第三方token網址String url = String.format("%s?token=%s", checkUrl,token);try {String re = HttpUtils.get(url);JSONObject jobj = JSONObject.parseObject(re);ok = jobj.get("code").toString().equals("200");} catch (Exception ex) {System.err.println(ex.getMessage());}return ok;}private String login() {String re = null;//參照前端提交的參數Map<String, String> params = new HashMap<>();params.put("tenantCode", "10001");params.put("username", account);params.put("password", password);params.put("type", "account");params.put("scope", "ui");params.put("grant_type", "password");params.put("client_id", "browser");Map<String, String> heads = new HashMap<>();heads.put("Authorization", "巴拉巴拉巴拉");heads.put("Content-Type", "application/x-www-form-urlencoded");try {//提交給自己的接口,登錄并返回access_token等。HttpUtils是自己寫的靜態類re = HttpUtils.post(String.format("http://localhost:%s/api/uaa/oauth/token", port), params, heads);} catch (Exception e) {re = e.getMessage();}return re;}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/714227.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/714227.shtml
英文地址,請注明出處:http://en.pswp.cn/news/714227.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于python數據可視化的學習(多維數組)

import numpy as np # 通過這個語句可以知道其是否存在nmpy這個包 創建數據 H np.array([[[94,26],[11,11]],[[22,22],[23,23]],[[33,33],[33,34]]]) # 理解其中的邏輯結構然后開始運行 # 一個基礎維度邏輯數據結構中包含一個一個二維數據&#xff0c;二維數組之后再次進行升…

Selenium基礎:自動化你的網頁交互!

在構建Python爬蟲的過程中&#xff0c;你可能會遇到需要與網頁進行交互的情況&#xff0c;比如填充表單、點擊按鈕等。這時&#xff0c;Selenium庫就成了你的有力工具。Selenium是一個強大的工具&#xff0c;能夠模擬用戶在網頁上的各種操作。本篇博客將向你介紹Selenium的基礎…

EdgeX Foundry 設備服務

文章目錄 1.設備服務2.設備配置文件3.設備資源4.資源屬性&#xff08;Attributes&#xff09;5.資源屬性&#xff08;Properties&#xff09;6.設備命令7.資源操作8.REST 命令端點9.推送事件 EdgeX Foundry # EdgeX Foundryhttps://iothub.org.cn/docs/edgex/ https://iothub.…

好用的AI模型集合

AI-Chat 這個網站提供的AI-Chat 3.5和AI-Chat 4.0聊天機器人&#xff0c;每天都可以免費使用。 不管是學習、工作還是日常生活&#xff0c;都能給我們帶來很大的幫助&#xff0c;效率真的可以說是翻倍了。我覺得&#xff0c;如果你想讓自己的生活更加高效、更加有序&#xff0…

WEB漏洞 SSRF簡單入門實踐

一、漏洞原理 SSRF 服務端請求偽造 原理&#xff1a;在某些網站中提供了從其他服務器獲取數據的功能&#xff0c;攻擊者能通過構造惡意的URL參數&#xff0c;惡意利用后可作為代理攻擊遠程或本地的服務器。 二、SSRF的利用 1.對目標外網、內網進行端口掃描。 2.攻擊內網或本地的…

Selenium 4.0+ 版本的“正確使用”以及“驅動程序的正確安裝”

前言 本文是該專欄的第18篇,后面會持續分享python爬蟲干貨知識,記得關注。 你是否還在使用selenium 3.0+版本呢?如果還是在使用selenium的舊版本,那就好好看完這篇文章,讓你立刻使用上最新的selenium版本——selenium 4.0+版本。 我們都知道selenium是一個開源的Web自動…

python+Selenium以IE模式打開edge瀏覽器

一、修改ie的注冊表 計算機\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Zones 下邊5個文件夾下的2500的值改成3 計算機\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Internet Settings\Zones 下邊5個文件夾下的2…

全量知識系統問題及SmartChat給出的答復 之12 知識圖表設計

Q32. 畫一個圖表 今天&#xff0c;我們開始設計圖表&#xff0c;以便能直觀表示前面各種概念名相及其位置關系&#xff0c;發現其中的問題和錯誤。 先畫出一個3*3的表格&#xff0c;還有一根對角線&#xff08;左上到右下&#xff09;&#xff0c;上面有列名&#xff0c;分別…

戲說c第二十六篇: 測試完備性衡量(代碼覆蓋率)

前言 師弟&#xff1a;“師兄&#xff0c;我又被鄙視了。說我的系統太差&#xff0c;測試不過關。” 我&#xff1a;“怎么說&#xff1f;” 師弟&#xff1a;“每次發布版本給程夏&#xff0c;都被她發現一些bug&#xff0c;太丟人了。師兄&#xff0c;有什么方法來衡量測試的…

css實現背景漸變疊加

線性漸變效果圖: .box{width: 100vw;height: 100vh;background:linear-gradient(to bottom,transparent,#fff 30%),linear-gradient(to right,pink,skyblue);}徑像漸變效果圖&#xff1a; .box{width: 100vw;height: 100vh;background:linear-gradient(to bottom,transparent,#…

【SVN】使用TortoiseGit刪除Git分支

使用TortoiseGit刪除Git分支 前言 平時我在進行開發的時候&#xff0c;比如需要開發一個新功能&#xff0c;這里以蘑菇博客開發服務網關-gateway功能為例 一般我都會在原來master分支的基礎上&#xff0c;然后拉取一個新的分支【gateway】&#xff0c;然后在 gateway分支上進…

MySQL學生成績管理系統based on C++ and Clion

mysql_free_result()函數的作用是釋放結果集的內存&#xff0c;是同步的&#xff0c;也就是要中斷一下 該實驗使用了MySQL鏈接數據庫的基本使用方法&#xff0c;具體使用了 MYSQL_RES 數據庫的mysql_store_result()函數的返回值是一個結果集&#xff0c;該函數的作用是檢索比…

langchain學習筆記(七)

RunnablePassthrough: Passing data through | &#x1f99c;?&#x1f517; Langchain 1、RunnablePassthrough可以在不改變或添加額外鍵的情況下傳遞輸入。通常和RunnableParallel結合使用去分配數值給到字典的新鍵 兩種方式調用RunnablePassthrough &#xff08;1&#…

FL Studio21編曲制作軟件中文版2024最新版本功能詳細介紹

一、軟件概述 FL Studio 21&#xff0c;全稱Fruity Loops Studio 21&#xff0c;是一款功能強大的編曲制作軟件&#xff0c;被廣泛應用于音樂創作、編曲、錄音、混音和后期制作等領域。其中文版為中國的音樂制作人和愛好者提供了更加便捷的操作體驗。 FL Studio 21 Win-安裝包…

探索ECMAScript語法的深度奧秘

隨著現代Web應用的崛起&#xff0c;ECMAScript&#xff08;簡稱ES&#xff09;成為了前端開發者的必備利器。ECMAScript定義了JavaScript的語法和基本結構&#xff0c;是JavaScript的標準規范。本文將深入探討ECMAScript語法的一些精妙之處&#xff0c;為讀者揭示其中的深度奧秘…

P10166 [DTCPC 2024] 環

解題思路 滿足的序列即為環若圖上有環&#xff0c;則代價為0若無環&#xff0c;則在圖上已有的邊在添加一條回邊可形成環對所有的點由小到大排序由于環的大小可以為2初值設為&#xff0c;先不管最小點之間是否有邊&#xff0c;反正不會更劣通過拓撲排序找環&#xff0c;在找環…

js:lodash template文件模板語法和應用

文檔 https://www.lodashjs.com/docs/lodash.templatehttps://lodash.com/docs/4.17.15#template 語法 <% VALUE %> 用來做不轉義插值&#xff1b;<%- VALUE %> 用來做 HTML 轉義插值&#xff1b;<% expression %> 用來描述 JavaScript 流程控制。 示例 …

AI技術大揭秘!你不可不知的頂級大模型

在這個數字化飛速發展的時代&#xff0c;AI大模型以其驚人的應用范圍和深遠的影響力&#xff0c;正逐漸成為各行各業的革命性力量。想象一下&#xff0c;在一個晴朗的午后&#xff0c;一個智能客服系統正輕松地處理著成千上萬的客戶咨詢&#xff0c;不僅回答速度快捷&#xff0…

http狀態,cookie、session、token的對比

http是無狀態的&#xff0c;也就是說斷開會話了服務器就不記得任何事情了&#xff0c;但這樣對于用戶會很麻煩&#xff0c;因為要不停輸入用戶名和密碼 cookie是放在瀏覽器里的數據&#xff0c;第一次訪問后服務器會set cookie&#xff0c;然后瀏覽器保存這個cookie&#xff0…

面向制造的設計

面向制造的設計&#xff08;Design for Manufacturing, DFM&#xff09;是一種設計方法論&#xff0c;它強調在產品設計階段就考慮制造過程中的各種約束和限制&#xff0c;以確保設計的可行性和可制造性。這種方法的目標是在產品設計的早期階段就優化設計方案&#xff0c;以減少…