SpringBoot3集成Spring Authorization Server和Spring Cloud Gateway实现网关统一认证

news2024/11/13 21:59:36

1. 概述

在微服务开发过程中,通常都会使用Spring Cloud Gateway构建统一的API网关,在访问微服务之前都会先校验访问者是否有权限访问资源,实现方式有很多,这里主要介绍Spring Cloud Gateway集成OAuth2.1如何实现网关统一认证。
Spring Cloud Gateway在认证过程中既可以作为OAuth Client,也可以作为OAuth Resource Server
作为OAuth Client流程如下:
oauth client
作为OAuth Resource Server流程如下:
oauth resource server
本文主要以基于OAuth Client实现,会涉及到三个微服务,一个认证中心服务,一个网关Client服务,一个后台资源服务

2. 搭建认证中心

认证中心的搭建可以参考SpringBoot3集成Spring Authorization Server搭建服务认证中心,不同的是在application.yml中配置如下属性:

server:
  port: 9000
spring:
  security:
    oauth2:
      authorizationserver:
        client:
          client-server-oidc:
            registration:
              client-id: client-server
              client-secret: '{noop}secret'
              client-authentication-methods:
                - client_secret_basic
              authorization-grant-types:
                - authorization_code
                - refresh_token
                - client_credentials
              redirect-uris:
                - http://127.0.0.1:8010/login/oauth2/code/client-server-oidc
              scopes:
                - openid
                - profile
              client-name: client-server
            require-authorization-consent: true

3. 搭建后台资源服务

3.1. 引入核心依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>

3.2. 编写application.yml

server:
  port: 8000
spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: http://127.0.0.1:9000

3.3. 编写ResourceServerConfig

@Configuration
@EnableWebSecurity
@EnableMethodSecurity(jsr250Enabled = true, securedEnabled = true)
public class ResourceServerConfig {

    @Bean
    SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests((authorize) -> authorize.anyRequest().authenticated())
                .oauth2ResourceServer((oauth2Resource) -> oauth2Resource.jwt(Customizer.withDefaults()));
        return http.build();
    }
}

3.4. 编写ResourceController

编写一个接口用于网关调用

@RestController
public class ResourceController {

    @GetMapping(value = "/resources")
    public String[] getResources() {
        return new String[] {"Resource 1", "Resource 2", "Resource 3"};
    }
}

4. 搭建Gateway Client

4.1. 引入核心依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>

4.2. 编写application.yml

server:
  port: 8010
spring:
  cloud:
    gateway:
      default-filters:
        - TokenRelay=
      routes:
        - id: backend_resource_route
          uri: http://127.0.0.1:8000
          predicates:
            - Path=/resources/**
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: http://127.0.0.1:9000
      client:
        provider:
          oauth-server:
            issuer-uri: http://127.0.0.1:9000
            user-info-uri: ${spring.security.oauth2.client.provider.oauth-server.issuer-uri}/user
            authorization-uri: ${spring.security.oauth2.client.provider.oauth-server.issuer-uri}/oauth2/authorize
            token-uri: ${spring.security.oauth2.client.provider.oauth-server.issuer-uri}/oauth2/token
        registration:
          client-server-oidc:
            provider: oauth-server
            client-id: client-server
            client-secret: secret
            client-name: client-server-oidc
            authorization-grant-type: authorization_code
            redirect-uri: http://127.0.0.1:8010/login/oauth2/code/{registrationId}
            scope:
              - profile
              - openid

4.3. 编写WebSecurityConfig

@Configuration
@EnableWebFluxSecurity
@EnableReactiveMethodSecurity
public class WebSecurityConfig {

    @Bean
    SecurityWebFilterChain defaultSecurityWebFilterChain(ServerHttpSecurity http) {
        http.authorizeExchange((authorize) -> authorize.anyExchange().authenticated());
        http.oauth2Login(Customizer.withDefaults());
        http.oauth2ResourceServer((oauth2Resource) -> oauth2Resource.jwt(Customizer.withDefaults()));
        http.csrf((csrf) -> csrf.disable());
        http.cors((cors) -> cors.disable());
        return http.build();
    }
}

5. 测试验证

依次启动认证中心服务,后台资源服务和网关Client服务,在浏览器输入http://127.0.0.1:8010/resources,会进入登录页面,输入用户名和密码admin/123456,授权服务后,页面会返回后台资源服务接口返回的数据
后台资源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2096186.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

公众号里的产品宣传册是如何制作的?

​随着微信的普及&#xff0c;越来越多的企业和个人开始关注公众号&#xff0c;希望通过这个平台宣传自己的产品和服务。然而&#xff0c;你是否想过&#xff0c;那些公众号里精美的产品宣传册是如何制作出来的呢&#xff1f;今天&#xff0c;就让我来带你了解公众号产品宣传册…

解决maven中阿里云镜像仓库无法下载源码的问题

解决 Sources not found for: org.springframework.kafka:spring-kafka:3.2.3 的问题 我们在写代码的时候&#xff0c;经常需要看源码&#xff0c;但是当我们在 idea 中下载源码的时候&#xff0c;提示我们&#xff1a; Sources not found for: org.springframework.kafka:sp…

EmguCV学习笔记 C# 7.2 特征点检测

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…

两个月冲刺软考——求解关系模式达到了第几范式题型(例题+讲解,一看就会)

目录 1.假设一对多联系不转换为一个独立的关系模式的话&#xff0c;那么生成的关系模式应该是将“一”的那一方的主键加入到“多”的一方的关系模式中。 2.求解关系模式达到了第几范式题型 1.假设一对多联系不转换为一个独立的关系模式的话&#xff0c;那么生成的关系模式应该…

10 款企业级项目管理系统是你理想中的那一款吗

市面上主流的 10 款企业级项目管理系统推荐&#xff1a;PingCode、Worktile、泛微 e-office、致远OA、Gitee、Asana、Trello、Basecamp、Monday.com、Smartsheet。 在选择合适的企业内部项目管理系统时&#xff0c;许多企业面临着如何找到一个既能满足当前需求&#xff0c;又能…

【生日视频制作】一群美女游轮船挥手AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程一群美女游轮船挥手AE模板修改文字生成器素材 怎么如何做的【生日视频制作】一群美女游轮船挥手AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件 下载AE模板 把AE模板导入AE软件 修改图片或文字 渲染出视频

24年一级消防工程师报名流程图解(建议电脑)

报考流程&#xff1a; 1、登录中国人事考试网&#xff0c;点击网上报名&#xff0c;登录帐户和密.码&#xff0c;找到“一级消防工程师”的报考入口&#xff0c;选择报考省份&#xff0c;进入在线报名界面。 2、报考人员阅读《承诺制告知书》和《报名须知》后&#xff0c;点击“…

【精选】基于Python的电影推荐系统的设计与实现(全网第一无二,最新定制)

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

后台框架-统一异常管理

搭建后台框架全局异常管理是一个很重要的部分&#xff0c;好在SpringBoot提供了很好的处理方法 使用ControllerAdvice ControllerAdvice是Spring MVC中的一个全局异常处理注解&#xff0c;它允许在一个地方集中处理所有控制器抛出的异常。通过使用ControllerAdvice&#xff0…

资源不是问题,网盘搜索神器!极空间部署聚合搜索工具『爱盼』

资源不是问题&#xff0c;网盘搜索神器&#xff01;极空间部署聚合搜索工具『爱盼』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 经常分享一些NAS的玩法和攻略&#xff0c;但是被问及最多的还是资源问题&#xff0c;我在那里下载啊&#xff1f;我在那里看啊&#xff1f;等等...…

LLM系列 | 36:Google最新开源大模型:Gemma 2介绍及其微调(下篇)

引言 环境安装 数据准备 下载 处理 模型训练 模型inference 结果 gemma-2-9b gemma-2-9b-it 引言 低头观落日&#xff0c;引手摘飞星。 小伙伴们好&#xff0c;我是微信公众号《小窗幽记机器学习》的小编&#xff1a;卖黑神话的小女孩。本文紧接前文Google最新开源大…

HarmonyOS NEXT未成年人模式无缝联动所有应用,过滤非适龄内容

背景 随着消费电子产品和移动互联网的普及&#xff0c;未成年人互联网普及率96.8%&#xff0c;超过80%的未成年人都拥有自己的上网设备&#xff0c;而如何引导孩子正确上网一直是家长们的担忧。市场上很多电子设备、系统推出了一些未成年人管控能力&#xff0c;却需要家长到各…

前端技术(六)—— AJAX详解

一、原生 AJAX 1. AJAX 简介 AJAX 全称为 Asynchronous JavaScript And XML&#xff0c;就是异步的 JS 和 XML。 通过 AJAX 可以在浏览器中向服务器发送异步请求&#xff0c;最大的优势&#xff1a;无刷新获取数据。 AJAX 不是新的编程语言&#xff0c;而是一种将现有的标准组…

【练习3】点击消除

地址&#xff1a;点击消除_牛客题霸_牛客网 (nowcoder.com) 分析&#xff1a; 消除的是“相邻且相等”的数&#xff0c;可以考虑用栈。这里使用StringBuilder来代替栈&#xff0c;好处是StringBuilder可以实现尾插和尾删的操作。 public class Main {public static void main(S…

Caching介绍

缓存&#xff08;Caching&#xff09;是计算机系统中一个非常关键且常用的技术&#xff0c;用于提高数据访问速度和系统性能。在Java编程中&#xff0c;缓存同样扮演着重要角色&#xff0c;特别是在处理大量数据、频繁访问数据库或远程服务时。 缓存的基本原理 缓存的基本原理是…

雅特力AT-START-F423开发板

文章目录 1、开箱2、硬件设计3、点灯初试4、gpio输入和中断5、定时器基本定时6、定时器输出PWM7、串口使用8、ADC和DAC测试9、IIC驱动OLED测试10、SPI驱动测试11、总结 1、开箱 最近官方给寄了板子&#xff0c;顺便测评一下吧&#xff0c;首先是开箱环节 板子是调试器开发板的…

栈与队列,优先队列与双端队列(C++)

在C语言阶段&#xff0c;我们学过两种数据结构&#xff0c;栈与队列&#xff0c;一种是先进后出&#xff0c;一种是先进先出。 在C阶段&#xff0c;我们有新容器来方便快捷的使用栈和队列而不需要我们手动来编写 即stack与queue 我们直接来看对应接口 stack 同时放上对应的…

9.标准化与软件知识产权基础知识

大纲 标准的分类 标准的编号 保护期限 知识产权的确定 侵权判断 补充 真题 1

全国大学生数据建模比赛——深度学习

全国大学生数学建模比赛中&#xff0c;深度学习可以成为解决复杂问题的有力手段。 一、深度学习的优势在比赛中的体现 强大的模式识别能力&#xff1a;深度学习模型&#xff0c;如卷积神经网络&#xff08;CNN&#xff09;和循环神经网络&#xff08;RNN&#xff09;&#xff0…

Linux 系统进程管理实战

今天给伙伴们分享一下Linux 系统进程管理&#xff0c;希望看了有所收获。 我是公众号「想吃西红柿」「云原生运维实战派」作者&#xff0c;对云原生运维感兴趣&#xff0c;也保持时刻学习&#xff0c;后续会分享工作中用到的运维技术&#xff0c;在运维的路上得到支持和共同进步…