ruoyi 若依框架采用第三方登錄

在項目中,前后端分離的若依項目,需要通過統一認證,或者是第三方協帶認證信息跳轉到本系統的指定頁面。需要前后端都做相應的改造,由于第一次實現時已過了很久,再次重寫時,發現還是搞了很長時間,所以花點時間整理出事,也方便給大家參考。

首先明確需要處理幾個部分:

一、后端的處理

? ? ? ?1、 在控制器層,SysLoginController? 中,原有的login方法之后,寫一個登錄的方法,注意其中的 loginService.logingcy(userId); 這個是下一步要實現的。通過第三方協議解析出用戶的信息,可能 是工號,或者是微信的openid這都無所謂,反正通過他你能找到本系統的用戶就可以了。

 @GetMapping("/logingcy")public AjaxResult logingcy(String ssouser){AjaxResult ajax = AjaxResult.success();try {//通過中間的協議解析出用戶的基本信息String[] userInfo = JasmineSsoUtil.getUserInfo(ssouser, Constants.SSODOMAIN, Constants.SSOKEY);String userId = userInfo[0];//以下為獲取此員工的待辦工單數量,并按要求返回值System.out.println("useris "+userId);String token =   loginService.logingcy(userId);ajax.put(Constants.TOKEN, token);return ajax;} catch (Exception e) {e.printStackTrace();}return AjaxResult.error();// 生成令牌}

2、在登錄服務中增加一個和原來登錄對應的方法 SysLoginService???loginService.logingcy(userId);

/*通過工程翼用戶登錄*/public String logingcy(String username){// 用戶驗證Authentication authentication = null;SysUser sysUser = userService.selectUserByUserName(username);System.out.println("admin  staffcode is "+ username +" and password is "+sysUser.getPassword());try{//已經確認解析出用戶信息,所以這里使用一個內部的特定密碼和模擬密碼進行檢驗userDetailsService.loadUserByUsername(username);UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(username, Constants.CPASSWORD);//AuthenticationContextHolder.setContext(token);// 該方法會去調用UserDetailsServiceImpl.loadUserByUsernameauthentication = authenticationManager.authenticate(token);}catch (Exception e){if (e instanceof BadCredentialsException){AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, MessageUtils.message("user.password.not.match")));throw new UserPasswordNotMatchException();}else{AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_FAIL, e.getMessage()));throw new ServiceException(e.getMessage());}}finally{//  AuthenticationContextHolder.clearContext();}AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));LoginUser loginUser = (LoginUser) authentication.getPrincipal();// 生成tokenreturn tokenService.createToken(loginUser);}

3、增加一個 SecurityProvider 用于密碼和校檢

具體的代碼如下:

package com.ruoyi.framework.security.provider;import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.exception.user.UserPasswordNotMatchException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.system.service.ISysUserService;
import org.apache.poi.hssf.record.DVALRecord;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.*;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;/*** 自定義認證服務* */
@Service("securityProvider")
public class SecurityProvider implements AuthenticationProvider {@Autowiredprivate BCryptPasswordEncoder bCryptPasswordEncoder;@Autowiredprivate UserDetailsService userDetailsService;@Autowiredprivate ISysUserService userService;public SecurityProvider(UserDetailsService userDetailsService) {this.userDetailsService = userDetailsService;}@Overridepublic Authentication authenticate(Authentication authentication) throws AuthenticationException {/*   UsernamePasswordAuthenticationToken token= (UsernamePasswordAuthenticationToken) authentication;*/String name = authentication.getName();String password = (String) authentication.getCredentials();System.out.println("name:"+name+"password:"+password);//這里直接判斷異常UserDetails user = userDetailsService.loadUserByUsername(name);String encoderPassword = bCryptPasswordEncoder.encode(password);SysUser user1 = userService.selectUserByUserName("admin");user1.setPassword(SecurityUtils.encryptPassword("admin123"));userService.updateUser(user1);System.out.println("1password is "+    SecurityUtils.encryptPassword(password));System.out.println("2password is"+encoderPassword);System.out.println("user passwordis "+user.getPassword());// 數據庫賬號密碼的校驗能通過就通過if (SecurityUtils.matchesPassword(password, user.getPassword())){//  if (bCryptPasswordEncoder.matches(password, user.getPassword())) {// log.info("使用賬戶密碼登錄");return new UsernamePasswordAuthenticationToken(user, encoderPassword);}//這里是第三方登錄的使用方式,用一個內部的密碼代替了password的位置// log.info(""+checkValid);if(Constants.CPASSWORD.equalsIgnoreCase(password)){return new UsernamePasswordAuthenticationToken(user, password);} else {// 如果都登錄不了,就返回異常輸出throw new UserPasswordNotMatchException();}}@Overridepublic boolean supports(Class<?> authentication) {//返回true后才會執行上面的authenticate方法,這步能確保authentication能正確轉換類型return  true;}}

4、修改配置文件? SecurityConfig 有兩處需要修改,一個是最下面,使用上一步定義的SecurityProvider

一個是上面,允許前端的新登錄頁面可以直接訪問

到此,后端部分的改造就完成了。

二、前端頁面

1、首先要做一個登錄過度頁面,內容可以為空白,只需要接收地址欄中的參數,并且調用上面第一步中定義的方法

2、在路由中配置路徑對應訪問的這個頁面

3、設置白名單,可以直接訪問頁面

4、在原來的login.js中寫入后臺對應的地址,這里注意需要先logou一下,防止重復登錄報錯

export function logingcy(ssouser) {logout();return request({url: '/logingcy?ssouser=' + ssouser,method: 'get',})
}

5、在user.js中增加一個action,這里需要寫入token是關鍵,不然后臺一直報未登錄

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

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

相關文章

PasteNow for mac剪貼板工具

PasteNow 是一款簡單易用的剪貼板管理工具&#xff0c;可幫助用戶快速存儲和管理剪貼板上的文本和圖片內容。用戶可以使用 PasteNow 軟件快速將文本內容保存到不同的筆記或頁面中&#xff0c;也可以方便地將剪貼板上的圖片保存到本地或分享給其他應用程序。 此外&#xff0c;P…

如何進行合理的股權激勵?

股權激勵是企業激勵員工和管理層的一種重要手段&#xff0c;通過向員工提供股權&#xff0c;可以將他們與企業利益緊密聯系在一起&#xff0c;激發員工的積極性和創造力&#xff0c;提高公司的績效和競爭力。然而&#xff0c;要實施合理的股權激勵&#xff0c;需要考慮多個因素…

vue 通過ref調用router-view子組件的方法

由于用的vue2.7版本&#xff0c;但用了vue3 setup的語法&#xff1b; 注意&#xff1a;是vue2的template結構&#xff0c;vue3的setup語法&#xff1b;非這種情況需要舉一反三。 處理方案&#xff1a; 1、對router-view加上ref template修改 直接對router-view加上ref&#x…

金蝶云星空和四化智造MES(WEB)單據接口對接

金蝶云星空和四化智造MES&#xff08;WEB&#xff09;單據接口對接 對接系統&#xff1a;四化智造MES&#xff08;WEB&#xff09; MES系統是集成生產管理、品質管理、設備管理、BI數據中心、庫存管理、工時管理、數據采集、看板管理等為一體的綜合性生產管理系統。通過強調制造…

wagtail-安裝配置

系列文章目錄 文章目錄 系列文章目錄安裝虛擬環境安裝wagtail查看安裝后的包 創建wagtail項目安裝依賴遷移創建超級用戶運行項目 安裝虛擬環境 https://blog.csdn.net/gsl371/article/details/117917857 安裝wagtail (wagenv) C:\djproject\wagprj>pip list Package V…

淘寶88vip退費問題

前一段時間&#xff0c;雙十一活動&#xff0c;想著開個淘寶的88vip領卷買東西會實惠一點&#xff0c;另外&#xff0c;它自帶的權益也不錯&#xff0c;有餓了嗎、網易云、優酷或者芒果的。但是到了當天發現&#xff0c;一個vip的卷也用不了&#xff0c;頓感什么惱火&#xff0…

synchronized的輕量級鎖居然不會自旋?

《Java并發編程的藝術》中說到「如果失敗&#xff0c;表示其他線程競爭鎖&#xff0c;當前線程便嘗試使用自旋來獲取鎖」&#xff0c;并且下文所配的流程圖中明確表示自旋失敗后才會升級為重量級鎖&#xff0c;但《深入理解Java虛擬機》又說「如果出現兩條以上的線程爭用同一個…

超聲波雪深傳感器冬季里的科技魔法

在冬季的某個清晨&#xff0c;當你打開大門&#xff0c;被厚厚的積雪覆蓋的大地映入眼簾&#xff0c;你是否曾想過&#xff0c;這片雪地的深度是多少&#xff1f;它又如何影響著我們的生活和環境&#xff1f;今天&#xff0c;我們將為你揭開這個謎團&#xff0c;介紹一款神秘的…

眼鏡清洗機原理是怎么樣的?2023年眼鏡清洗機推薦

在日常生活中有許多小伙伴是因為看太多書或者是看太多電子產品導致近視佩戴上了眼鏡&#xff0c;畢竟眼鏡佩戴上后就再也離不開它了&#xff0c;像日常佩戴的眼鏡上會積累非常多污垢以及堆積細菌&#xff0c;而我們手動清洗眼鏡時不能除菌也不能清潔到縫隙中&#xff0c;像眼鏡…

thingsboard的WebSocket API的使用

1、參考文檔 Working with telemetry data | ThingsBoard Community Edition 2、訂閱的命令 我們需要訂閱不同的數據,那么該如何來填寫參數呢,你需要參考后端代碼 TelemetryPluginCmdsWrapper 以及訂閱返回的結果參考類:TelemetrySubscriptionUpdate 鏈接地址: https:/…

error: ‘for‘ loop initial declarations are only allowed in C99 or C11 mode

在使用for循環時&#xff0c;在循環內定義變量&#xff0c;出現如下錯誤 [Error] ‘for’ loop initial declarations are only allowed in C99 or C11 mode [Note] use option -stdc99&#xff0c;-stdgnu99&#xff0c;-stdc11 or-stdgnu11 to compile your code 出現這個錯誤…

使用Pytorch從零開始構建GRU

門控循環單元 (GRU) 是 LSTM 的更新版本。讓我們揭開這個網絡的面紗并探索這兩個兄弟姐妹之間的差異。 您聽說過 GRU 嗎&#xff1f;門控循環單元&#xff08;GRU&#xff09;是更流行的長短期記憶&#xff08;LSTM&#xff09;網絡的弟弟&#xff0c;也是循環神經網絡&#x…

極智AI | LLM大模型部署框架之OpenLLM

歡迎關注我的公眾號 [極智視界],獲取我的更多經驗分享 大家好,我是極智視界,本文來介紹一下 LLM大模型部署框架之OpenLLM。 邀您加入我的知識星球「極智視界」,星球內有超多好玩的項目實戰源碼下載,鏈接:https://t.zsxq.com/0aiNxERDq 由于 LLM 大模型在模型結構、模型規…

圖像評價之計算PSNR、SSIM、MSE、LPIPS和NIQE評價指標

文章目錄 鏈接說明代碼峰值信噪比結構相似性均方誤差學習感知圖像塊相似性自然圖像質量評估器 鏈接 GitHub 倉庫 如果代碼對你的研究有所幫助&#xff0c;請為該倉庫點上小星星。 說明 PSNR、SSIM、MSE和LPIPS是有監督指標&#xff0c;計算時必須是兩對圖像參與&#xff1b;…

安索夫矩陣(ANSOFF)

&#x1f449;安索夫矩陣是策略管理之父安索夫博士于1957年提出的營銷策略模型&#xff0c;該模型以“產品”和“市場”作為兩大基本面&#xff0c;提出了4種不同組合下的營銷策略&#xff0c;是營銷分析中應用最廣泛的工具之一。其主要邏輯是通過選擇4種不同的成長性策略來實現…

C++11的線程

線程的創建 用std::thread創建線程非常簡單&#xff0c;只需要提供線程函數或者線程對象即可&#xff0c;并可以同時指定線程函數的參數。下面是創建線程的示例&#xff1a; #include <thread> #include <iostream> using namespace std;void func() {cout <<…

C# 獲取圖像、字體等對象大小的數據結構SizeF

如果你想要獲取字符串 "你好嗎" 的字節數組長度或者字符數&#xff0c; 使用如下代碼&#xff1a; string s "你好嗎"; //字節數組長度 int byteCount System.Text.Encoding.UTF8.GetBytes(s).Length; //字符數 int charCount s.Length; 如果你想獲取…

大話設計模式C++實現

大話設計模式&#xff0c;講得非常好&#xff0c;但是作者是用C#寫的&#xff0c;為了方便C程序員&#xff0c;使用C寫了大話設計模式的代碼 詳情見Github&#xff1a;https://github.com/liubamboo/BigTalkDesignPattern

新蘋果手機如何導入舊手機數據?解決方案來了,記得收藏!

為了保持其競爭優勢&#xff0c;蘋果公司不斷推出新的產品和服務&#xff0c;因此蘋果手機的更新換代速度是比較快的。正巧最近剛出了iPhone15&#xff0c;相信很多小伙伴已經換上了期待已久的新手機。 更換新手機后&#xff0c;大家都會面臨一個問題&#xff1a;新蘋果手機如…