在同一上下文中使用 Spring Boot 2 OAuth 客户端和资源服务器

2023-11-26

我希望我的 Spring Boot 应用程序能够为受保护的前端提供服务,同时作为该前端的 API 资源服务器,但我无法让 oauth 的东西正常工作。

我想要的是当浏览器请求没有令牌的index.html时,Spring Boot应用程序返回302重定向到oauth服务器(在我的例子中是gitlab),因此用户被发送到登录表单。但我还希望 API 在没有令牌的情况下调用 API 时返回 401,因为我认为 302 重定向到登录页面在那里不是很有用。

在伪代码中:

if document_url == /index.html and token not valid
  return 302 https//gitlab/loginpage
if document_url == /api/restcall and token not valid
  return 401
server document_url

我正在使用 spring boot 2.1,关于 oauth 我的 pom.xml 包含

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

这是我在 SecurityConfig 中的天真的尝试

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests().antMatchers("/index.html").authenticated()
        .and()
            .oauth2Login().loginPage("/oauth2/authorization/gitlab")

        .and()
            .authorizeRequests().antMatchers("/api/restcall").authenticated()
        .and()
            .oauth2ResourceServer().jwt();
    }
}

两种配置(oauth2Login 和 oauth2ResourceServer)都可以正常工作。但是,一旦我将它们组合起来,最后一个就会获胜(因此在上面的示例中,不会有 302,浏览器也会看到 index.html 的 401)。我认为他们共享一些配置对象,所以最后的写入获胜。

有没有一种(简单)的方法来得到我想要的东西?我知道 spring 几乎可以做任何事情,但我非常不希望最终手动配置无数的 beans...

Update:

我已经为我的代码做了一个最小的例子(包括@dur的建议)here


您需要创建多个配置并将它们仅限于特定的 URL 模式,使用requestMatcher。根据您的示例,您的配置应如下所示:

安全配置HTML

public class SecurityConfigHTML extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .requestMatchers().antMatchers("/index.html")
                .and()
                .authorizeRequests().anyRequest().authenticated()
                .and()
                .oauth2Login().loginPage("/oauth2/authorization/gitlab");
    }
}

安全配置API

public class SecurityConfigAPI extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .requestMatchers().antMatchers("/api/call")
                .and()
                .authorizeRequests().anyRequest().authenticated()
                .and()
                .oauth2ResourceServer().jwt();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在同一上下文中使用 Spring Boot 2 OAuth 客户端和资源服务器 的相关文章

  • 无论线程如何,对象是否总是能看到其最新的内部状态?

    假设我有一个带有简单整数计数变量的可运行对象 每次可运行对象运行时该变量都会递增 该对象的一个 实例被提交以在计划的执行程序服务中定期运行 class Counter implements Runnable private int coun
  • Selenium:将 Internet Explorer 中的文件下载到指定文件夹,无需直接链接,无需 Windows 窗体,无需 AutoIt 或 Robot

    我经常遇到一个问题 如何在 IE 中下载文件 与 Firefox 的 Chrome 不同 您不能只指定所需的文件夹 所有文件都会下载到该文件夹 您还需要与本机 Windows 表单等进行交互 有多种选项 例如使用 AutoIt 使用键盘命令
  • Java,顺序流在哪个线程中执行?

    在阅读有关流的文档时 我遇到了以下句子 attempting to access mutable state from behavioral parameters presents you with a bad choice if you
  • 了解 netty 通道缓冲区和水印

    我正在尝试了解网络缓冲区和水印 作为一个测试用例 我有一个 netty 服务器 它向客户端写入数据 客户端被阻止 基本上每次读取之间有 10 秒的睡眠时间 在正常 I O 下 如果接收方被阻塞 TCP 发送方将受到限制 由于流量控制 发送速
  • 类型已知,但方法指的是缺失类型

    我对 java 和 Eclipse 不太有经验 但遇到以下问题 我正在写类似的东西 Point3D myPoint myClass myMethod arg 我收到错误 方法 myMethod myType arg 引用缺失的类型 Poin
  • Java 小程序在 Mac 上闪烁

    这个问题很奇怪 问题并非在每个平台上都会发生 我在使用 MacOSX 的 Google Chrome 中出现了这种情况 但在 Safari 中却没有出现这种情况 对于使用 Windows 的朋友来说 在 Google Chrome 上运行得
  • JAXB 继承冲突 - 重新注释子类

    目前我的项目中有这样的环境 public abstract class Foo private List
  • 获取Android库中的上下文

    我正在编写一个 Android 应用程序 它的一些功能封装在内部库中 但是 要使此功能发挥作用 库需要一个应用程序上下文的实例 为图书馆提供这种上下文的最佳方式是什么 我看到了一些选择 但没有一个有吸引力 Have my library c
  • 在拇指上方显示修改后的 JSlider 值

    有没有一种简单的方法可以在使用某些 外观和感觉 的同时更改 JSlider 上方标签中显示的值 为了清楚起见 我正在谈论这个值 具体来说 我想显示除以 1000 的值而不是值本身 我知道如果我显示它们 我可以为刻度设置标签 但用户将不得不猜
  • 如何在Netbeans中设置JList的ListModel?

    我在 Netbeans IDE 的帮助下设计了一个 Swing GUI 该 GUI 包含一个 JList 默认情况下 它使用 QAbstractListModel 将其作为 JList 构造函数中的参数传递以创建该 JList 我想在 Ne
  • 如何在 Eclipse 中获得完全限定的类名?

    有没有一种快速方法可以在 Eclipse 中单击 Java 类并获取其完全限定名称 或将其复制到剪贴板 2016年6月29日编辑 正如 Jeff 所指出的 您只需要执行以下第二步 1 Double click on the class na
  • Time.valueOf 方法返回错误值

    我使用 Time valueOf 方法将字符串 09 00 00 转换为 Time 对象 如下所示 Time valueOf LocalTime parse 09 00 00 当我调用 getTime 来显示我得到的值时 28800000
  • Java HashSet 是线程安全的只读吗?

    如果我通过 Collections unmodifyingSet 运行 HashSet 实例后 它是线程安全的吗 我问这个是因为 Set 文档声明它不是 但我只是执行读取操作 来自 Javadoc 请注意 此实现不是同步的 如果多个线程同时
  • 从字节数组设置 img src

    我需要设置img src我在对象中拥有的字节数组的属性 img
  • 获取 Future 对象的进度的能力

    参考 java util concurrent 包和 Future 接口 我注意到 除非我弄错了 只有 SwingWorker 实现类才能启动冗长的任务并能够查询进度 这就引出了以下问题 有没有办法在非 GUI 非 Swing 应用程序 映
  • 开发者环境-如何调用/消费其他微服务

    背景 我的环境 Java Play2 MySql 我在 Play2 gt S1 S2 S3 上编写了 3 个无状态 Restful 微服务 S1 消耗来自 S2 和 S3 的数据 因此 当用户点击 S1 时 该服务会异步调用 S2 S3 合
  • Proguard 正在破坏我的清洁度。 Gson 和泛型

    我有一个从持久性加载信息的函数 我只是以一种非常简单的方式告诉它的类型 该类称为SharedPreferencesHelper kt所以它是一个真正的生活问题解决者 fun
  • Firebase:用户注册后如何进行电话号码验证?

    所以我知道我可以使用电子邮件验证或电话号码验证 但我想做的是在用户注册或登录后进行电话号码验证 如何连接这两种身份验证方法 最后 Firebase中是否有一个函数可以检查用户是否通过电话号码验证 谢谢 即使用户已通过身份验证 您仍然可以使用
  • Java 中序列化的目的是什么?

    我读过很多关于序列化的文章 以及它如何如此美好和伟大 但没有一个论点足够令人信服 我想知道是否有人能真正告诉我通过序列化一个类我们真正可以实现什么 让我们先定义序列化 然后我们才能讨论它为什么如此有用 序列化只是将现有对象转换为字节数组 该
  • com.sun.xml.ws.message.saaj.SAAJHeader 无法转换为 com.sun.xml.ws.security.opt.impl.outgoing.SecurityHeader

    我正在尝试访问第三方 Web 服务 该服务要求我创建一个传递时间信息 用户名和密码的安全标头 我在网上搜索了可行的示例 并尝试了多种方法 我正在尝试使用 Java 6 中内置的内容来做到这一点 我不确定我做错了什么 从 WSDL 生成 We

随机推荐

  • 计算两列中任意一列中字符串出现次数的向量化方法

    我有一个问题是similar to 这个问题 但只是足够不同 无法用相同的解决方案来解决 我有两个数据框 df1 and df2 像这样 import pandas as pd import numpy as np np random se
  • 如何下载离线副本MSDN(微软帮助文档)?

    我可以下载离线副本MSDN 微软帮助文档 吗 例如 我整天无法访问互联网 但我需要访问帮助信息 又该如何做呢 Yes 如果要简短 只需安装微软帮助查看器在其中您可以离线复制您需要的所有项目 Full instruction you can
  • 编程中的“原子”是什么意思?

    在 Effective Java 一书中 它指出 语言规范保证读或写 变量是原子的 除非变量是类型long or double JLS 17 4 7 在 Java 编程或一般编程中 原子 是什么意思 这是一个例子 假设foo是一个类型变量l
  • 在 Android Studio 上通过 CMake 将 OpenCV 添加到 Native C 代码

    我正在尝试通过 Cmake 将 Opencv 包含到 android studio 项目中的本机 C 代码中 我在网上做了一些研究 并从网上下载了FindOpenCV cmake文件并将其添加到我的android项目的app目录中 这也是
  • 实现后密封接口

    我正在做一个小项目 我遇到了这个问题 项目输出是一个包含接口的库 如果可能的话 我想实现该接口并密封其中的功能 public interface ITest void SomeMethod class A ITest public seal
  • 如何从扩展中退出 Chrome?

    我正在开发 Chrome 扩展程序 有时我需要退出浏览器进程 我尝试使用以下代码关闭所有窗口 chrome windows getCurrent function window chrome windows remove window id
  • git-clone 和结帐后钩子

    根据手册 post checkout钩子在 a 之后运行git checkout 正如预期的那样 而且经过git clone 除非你通过 no checkout 很好 现在考虑以下几点 您之前没有本地存储库git clone 挂钩在遥控器之
  • Angular 6:如何根据滚动突出显示导航栏上的元素?

    我正在 Angular 6 中制作一个页面 这是一个简单的页面 我想强调一下navbar取决于滚动 这是我的代码 sticky position sticky top 0 i ul list style type none margin 0
  • extbase 存储库 findAll() 返回结果 null

    我有几个这样的控制器 CategoryController 和 NewsController 以及类别和新闻的领域模型以及两者的存储库 在 NewsController 中 我执行如下的 dependencyInjection 与在cate
  • 如何在 React 中访问 DOM 元素? React 中的 document.getElementById() 相当于什么

    如何在react js中选择某些栏 这是我的代码 var Progressbar React createClass getInitialState function return completed this props complete
  • 为什么使用 pandas apply 时会出现 AttributeError 错误?

    我应该如何根据条件将 NaN 值转换为分类值 我在尝试转换 Nan 值时遇到错误 category gender sub category title health beauty NaN makeup lipbalm health beau
  • jQuery UI 滑块 - 根据拖动方向选择重叠滑块

    我有这个简单的 jQuery UI 滑块设置 其中包含一个范围和两个重叠的默认值 整个事情 还有一些花里胡哨的东西 可以在这个 jsfiddle 中找到 http jsfiddle net yijian XeyGS slider slide
  • pandas.read_csv:如何跳过注释行

    我想我误解了 read csv 的意图 如果我有一个文件 j 例如 notes a b c more notes 1 2 3 我怎样才能 pandas read csv 这个文件 跳过任何 注释行 我在帮助中看到不支持行的 注释 但它指示应
  • PHP 文件列出多个文件扩展名

    这是我当前的代码 files glob jpg 这很好用 但是 我想列出其他图像类型 例如 png gif 等 我可以请一些帮助来修改上面的代码以使其正常工作吗 我尝试了以下方法但没有成功 files glob jpg png gif fi
  • Web应用程序:框架还是不框架?

    我了解 PHP 并且刚刚开始使用 MySql 但计划使用 ODBC 我不需要任何书籍来解释这一点 我可能有资格开发一个简单的网站 但目标是开发相当雄心勃勃的应用程序 我想几乎所有的网络应用程序都有一些共性 比如安全性 可扩展性等 例如 我完
  • will_paginate 报告太多条目和页面

    我使用 will paginate 来显示从包含联接和 select 语句的查询返回的数据 当我对数据进行分页时 条目数等于执行 select 语句之前的条目数 即使在查询之后调用分页 并且查询包含的元素比分页报告少 sales Sale
  • 如何更改 Octave 中的工具包?

    当我执行时我的 Octave 崩溃了plot命令 我找到了一个解决方案阿萨德 易卜拉欣的回答 他提到将默认工具包切换为gnuplot 并将其更改为octave rc文件 如果我想永久进行更改 但我不清楚永久更改octaverc 当我打开我的
  • 将字符串数据从线程发送到主窗体

    在Dephi中 我创建一个线程 像这样 它会不时向主窗体发送消息 Procedure TMyThread SendLog I Integer Var Log array 0 255 of Char Begin strcopy Log PCh
  • 如何在两个屏幕之间使用块模式

    我的 main dart 文件如下所示 home MultiBlocProvider providers BlocProvider
  • 在同一上下文中使用 Spring Boot 2 OAuth 客户端和资源服务器

    我希望我的 Spring Boot 应用程序能够为受保护的前端提供服务 同时作为该前端的 API 资源服务器 但我无法让 oauth 的东西正常工作 我想要的是当浏览器请求没有令牌的index html时 Spring Boot应用程序返回