使用網關和Spring Security進行認證和授權

個人名片
在這里插入圖片描述
🎓作者簡介:java領域優質創作者
🌐個人主頁:碼農阿豪
📞工作室:新空間代碼工作室(提供各種軟件服務)
💌個人郵箱:[2435024119@qq.com]
📱個人微信:15279484656
🌐個人導航網站:www.forff.top
💡座右銘:總有人要贏。為什么不能是我呢?

  • 專欄導航:

碼農阿豪系列專欄導航
面試專欄:收集了java相關高頻面試題,面試實戰總結🍻🎉🖥?
Spring5系列專欄:整理了Spring5重要知識點與實戰演練,有案例可直接使用🚀🔧💻
Redis專欄:Redis從零到一學習分享,經驗總結,案例實戰💐📝💡
全棧系列專欄:海納百川有容乃大,可能你想要的東西里面都有🤸🌱🚀

目錄

  • 使用網關和Spring Security進行認證和授權
    • 1. 什么是網關?
      • 1.1 網關的功能
    • 2. 什么是Spring Security?
      • 2.1 Spring Security的核心概念
    • 3. 網關和Spring Security的集成
      • 3.1 項目結構
      • 3.2 配置api-gateway
        • 3.2.1 添加依賴
        • 3.2.2 配置路由
        • 3.2.3 實現JWT過濾器
      • 3.3 配置auth-service
        • 3.3.1 添加依賴
        • 3.3.2 實現認證控制器
      • 3.4 配置user-service
        • 3.4.1 添加依賴
        • 3.4.2 配置Spring Security
    • 4. 結論

使用網關和Spring Security進行認證和授權

在現代微服務架構中,網關和認證授權機制是保障系統安全性和穩定性的重要組成部分。本文將詳細介紹如何結合使用網關和Spring Security來實現認證和授權,確保微服務系統的安全和可靠。

1. 什么是網關?

網關是微服務架構中的一個重要組件,它充當系統的入口,負責請求的路由、負載均衡、限流、熔斷、日志記錄等功能。通過網關,可以實現對外部請求的統一管理和控制,提高系統的安全性和可維護性。

1.1 網關的功能

  • 路由:將外部請求路由到對應的內部微服務。
  • 負載均衡:將請求分發到多個服務實例,平衡負載。
  • 限流:限制單位時間內的請求數量,防止系統過載。
  • 熔斷:在某個服務不可用時,自動切換到備用方案。
  • 日志記錄:記錄請求和響應的詳細信息,便于監控和調試。
  • 身份驗證和授權:攔截請求,驗證用戶身份,檢查權限。

2. 什么是Spring Security?

Spring Security是一個功能強大且高度可定制的安全框架,專為Java應用提供認證和授權服務。它可以與各種身份驗證機制(如LDAP、OAuth2、JWT)集成,提供全面的安全解決方案。

2.1 Spring Security的核心概念

  • 認證(Authentication):驗證用戶的身份,確保用戶是他們聲稱的那個人。
  • 授權(Authorization):驗證用戶的權限,確保用戶有權訪問特定資源。
  • 過濾器鏈(Filter Chain):Spring Security通過一系列過濾器來處理請求,實現認證和授權邏輯。
  • 安全上下文(Security Context):存儲當前用戶的安全信息,如用戶詳情和權限信息。

3. 網關和Spring Security的集成

在微服務架構中,通常使用網關來統一處理外部請求,并結合Spring Security進行認證和授權。以下是一個使用Spring Cloud Gateway和Spring Security實現認證和授權的示例。

3.1 項目結構

假設我們有以下幾個微服務:

  • api-gateway:網關服務
  • auth-service:認證服務,負責生成JWT令牌
  • user-service:用戶服務,提供用戶信息和操作

3.2 配置api-gateway

首先,在api-gateway中配置Spring Cloud Gateway和Spring Security。

3.2.1 添加依賴

pom.xml 中添加以下依賴:

<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId></dependency>
</dependencies>
3.2.2 配置路由

application.yml 中配置路由:

spring:cloud:gateway:routes:- id: user-serviceuri: lb://USER-SERVICEpredicates:- Path=/user/**filters:- TokenRelay=
3.2.3 實現JWT過濾器

創建一個JWT過濾器,用于解析和驗證JWT令牌:

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.WebFilter;
import org.springframework.web.server.WebFilterChain;
import reactor.core.publisher.Mono;@Component
public class JwtAuthenticationFilter implements WebFilter {@Value("${jwt.secret}")private String jwtSecret;@Overridepublic Mono<Void> filter(ServerWebRequest request, WebFilterChain chain) {String token = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION);if (token != null && token.startsWith("Bearer ")) {token = token.substring(7);try {Claims claims = Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(token).getBody();request.mutate().header("userId", claims.getSubject()).build();} catch (Exception e) {return Mono.error(new RuntimeException("Invalid JWT token"));}}return chain.filter(request);}
}

3.3 配置auth-service

auth-service負責用戶認證和JWT令牌的生成。

3.3.1 添加依賴

pom.xml 中添加以下依賴:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId></dependency>
</dependencies>
3.3.2 實現認證控制器

創建一個控制器,用于處理用戶登錄并生成JWT令牌:

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.web.bind.annotation.*;import java.util.Date;@RestController
@RequestMapping("/auth")
public class AuthController {@Value("${jwt.secret}")private String jwtSecret;@Value("${jwt.expiration}")private long jwtExpiration;private final AuthenticationManager authenticationManager;private final UserDetailsService userDetailsService;public AuthController(AuthenticationManager authenticationManager, UserDetailsService userDetailsService) {this.authenticationManager = authenticationManager;this.userDetailsService = userDetailsService;}@PostMapping("/login")public String login(@RequestBody LoginRequest loginRequest) {try {Authentication authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword()));String token = Jwts.builder().setSubject(authentication.getName()).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + jwtExpiration)).signWith(SignatureAlgorithm.HS512, jwtSecret).compact();return token;} catch (AuthenticationException e) {throw new RuntimeException("Invalid username or password");}}
}

3.4 配置user-service

user-service提供用戶相關的業務功能,并通過Spring Security進行保護。

3.4.1 添加依賴

pom.xml 中添加以下依賴:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>
</dependencies>
3.4.2 配置Spring Security

SecurityConfig 中配置Spring Security:

import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/user/**").authenticated().anyRequest().permitAll().and().oauth2Login();}
}

4. 結論

通過結合使用網關和Spring Security,可以實現微服務系統的統一認證和授權管理。本文介紹了如何使用Spring Cloud Gateway和Spring Security來保護微服務,并通過JWT令牌實現用戶身份驗證和權限控制。這種架構不僅提高了系統的安全性,還簡化了認證和授權邏輯的實現。在實際項目中,可以根據具體需求和場景,進一步擴展和優化這一解決方案,提升系統的可用性和安全性。

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

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

相關文章

jquery發送jsonp請求

使用 jQuery 發送 JSONP 請求相對來說比較簡單&#xff0c;以下是示例代碼&#xff1a; $.ajax({url: "http://example.com/data",dataType: "jsonp",jsonp: "callback",jsonpCallback: "myCallback" }).done(function(response) {//…

Linux命令更新-sort 和 uniq 命令

簡介 sort 和 uniq 都是 Linux 系統中常用的文本處理命令。 sort 命令用于對文件內容進行排序。 uniq 命令用于去除文件中重復出現的行。 1. sort 命令 命令格式 sort [選項] [文件]選項&#xff1a; -n: 按照數字進行排序 -r: 反向排序 -c: 統計每個元素出現的次數 -…

怎么錄制視頻?電腦錄制,試試這3種方法

在數字化快速發展的時代&#xff0c;視頻已經成為我們傳遞信息、分享生活、表達情感的重要載體。每一個人都希望自己能夠掌握視頻錄制技巧&#xff0c;輕松駕馭影像的力量&#xff0c;創造出屬于自己的視覺盛宴。 那么&#xff0c;怎么錄制視頻呢&#xff1f;首先選擇一款好用…

vue腳手架配置代理請求

在 Vue 腳手架中&#xff0c;可以通過配置vue.config.js文件來設置代理請求&#xff0c;以解決跨域問題或實現其他代理需求。以下是兩種常見的配置方式&#xff1a; 方法一&#xff1a; 在vue.config.js中添加如下配置&#xff1a; module.exports {devServer: {proxy: http…

《信息與電腦(理論版)》是什么級別的期刊?是正規期刊嗎?能評職稱嗎?

問題解答 問&#xff1a;《信息與電腦(理論版)》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知網收錄的正規學術期刊。 問&#xff1a;《信息與電腦(理論版)》級別&#xff1f; 答&#xff1a;省級。主管單位&#xff1a;北京電子控股有限責任公司 主辦…

AI安全入門-人工智能數據與模型安全

參考 人工智能數據與模型安全 from 復旦大學視覺與學習實驗室 文章目錄 0. 計算機安全學術知名公眾號1. 概述數據安全模型安全 3. 人工智能安全基礎3.1 基本概念攻擊者攻擊方法受害者受害數據受害模型防御者防御方法威脅模型目標數據替代數據替代模型 3.2 威脅模型3.2.1 白盒威…

實踐致知第16享:設置Word中某一頁橫著的效果及操作

一、背景需求 小姑電話說&#xff1a;現在有個word文檔,里面有個表格太長&#xff08;如下圖所示&#xff09;&#xff0c;希望這一個設置成橫的&#xff0c;其余頁還是保持豎的&#xff01; 二、解決方案 1、將鼠標放置在該頁的最前面閃爍&#xff0c;然后選擇“頁面”》“↘…

Python面經

文章目錄 Python基本概念1. Python是**解釋型**語言還是**編譯型**語言2. Python是**面向對象**語言還是面向過程語言3. Python基本數據類型4.append和 extend區別5.del、pop和remove區別6. sort和sorted區別介紹一下Python 中的字符串編碼is 和 的區別*arg 和**kwarg作用淺拷…

Electron 進程間通信

文章目錄 渲染進程到主進程&#xff08;單向&#xff09;渲染進程到主進程&#xff08;雙向&#xff09;主進程到渲染進程 &#xff08;單向&#xff0c;可模擬雙向&#xff09; 渲染進程到主進程&#xff08;單向&#xff09; send &#xff08;render 發送&#xff09;on &a…

【Stable Diffusion】(基礎篇三)—— 圖生圖基礎

圖生圖基礎 本系列筆記主要參考B站nenly同學的視頻教程&#xff0c;傳送門&#xff1a;B站第一套系統的AI繪畫課&#xff01;零基礎學會Stable Diffusion&#xff0c;這絕對是你看過的最容易上手的AI繪畫教程 | SD WebUI 保姆級攻略_嗶哩嗶哩_bilibili 本文主要講解如何使用S…

客戶端與服務端之間的通信連接

目錄 那什么是Socket? 什么是ServerSocket? 代碼展示&#xff1a; 代碼解析&#xff1a; 補充&#xff1a; 輸入流&#xff08;InputStream&#xff09;&#xff1a; 輸出流&#xff08;OutputStream&#xff09;&#xff1a; BufferedReader 是如何提高讀取效率的&a…

K8s集群初始化遇到的問題

kubectl describe pod coredns-545d6fc579-s9g5s -n kube-system 找到原因1&#xff1a;CoreDNS Pod 處于 Pending 狀態的原因是集群中的節點都帶有 node.kubernetes.io/not-ready 污點 journalctl -u kubelet -f 14:57:59.178592 3553 remote_image.go:114] "PullIma…

《簡歷寶典》12 - 簡歷中“項目經歷”,內功學習 - 下篇

這一小節呢&#xff0c;我們繼續說簡歷中 “項目經歷” 的一些內功心法。因為項目經歷比較核心&#xff0c;所以說完了&#xff0c;內功呢&#xff0c;我們會著重說一下 實戰部分。 目錄 1 所用技術的考慮 2 自我成長的突出 3 綜合使用STAR法則 4 小節 1 所用技術的考慮 …

如何評估AI模型:評估指標的分類、方法及案例解析

如何評估AI模型&#xff1a;評估指標的分類、方法及案例解析 引言第一部分&#xff1a;評估指標的分類第二部分&#xff1a;評估指標的數學基礎第三部分&#xff1a;評估指標的選擇與應用第四部分&#xff1a;評估指標的局限性第五部分&#xff1a;案例研究第六部分&#xff1a…

pear-admin-fast項目修改為集成PostgreSQL啟動

全局搜索代碼中的sysdate()&#xff0c;修改為now() 【前者是mysql特有的&#xff0c;后者是postgre特有的】修改application-dev.yml中的數據庫url使用DBeaver把mysql中的數據庫表導出csv&#xff0c;再從postgre中導入csv腳本轉換后出現了bpchar(xx)類型&#xff0c;那么一定…

用友U8存貨分類按層級取數SQL語句

SELECT cInvCCode 分類編碼, cInvCName 分類名稱, iInvCGrade 分類層級, ss.bInvCEnd 是否是末級, aa.* FROM InventoryClass ss LEFT JOIN ( SELECT * FROM ( SELECT cInvCCode AS 一級分類編碼, …

python數據可視化(6)——繪制散點圖

課程學習來源&#xff1a;b站up&#xff1a;【螞蟻學python】 【課程鏈接&#xff1a;【【數據可視化】Python數據圖表可視化入門到實戰】】 【課程資料鏈接&#xff1a;【鏈接】】 Python繪制散點圖查看BMI與保險費的關系 散點圖: 用兩組數據構成多個坐標點&#xff0c;考察…

如何降低老年人患帕金森病的風險?

降低老年人患帕金森病風險的方法 避免接觸有害物質&#xff1a;長期接觸某些化學物質、農藥或其他有害物質可能會增加患帕金森病的風險。應減少這些物質的暴露&#xff0c;例如在工作或生活中采取防護措施。 健康飲食&#xff1a;均衡飲食&#xff0c;多吃富含抗氧化劑的食物&a…

做了一個萬能搜索框

最近給網頁做了一個搜索框&#xff0c;現在搜索比以前更加方便了&#xff0c;下面簡單介紹一下如何使用 我們進入網頁版&#xff08;app.zyjj.cc&#xff09;點擊右上角的搜索就可以看到這個新版的搜索框了 目前支持中文、拼音、首字母等多種搜索方式&#xff0c;大家可以隨意…

【Python】Python-docx使用實例 科技檔案封面批量生成

使用背景 根據excel表中的信息&#xff0c;按照word模板格式&#xff0c;每條信息生成一個對應的模板及文件名。 我這里的情況是將科技檔案的封面格式按照案卷表的明細批量生成。 &#xff08;單位的檔案軟件太雞肋了&#xff0c;沒有這個功能&#xff09; 代碼整篇 工程檔…