Spring OAuth:带有授权服务器后端的资源服务器

2023-11-25

我想开发两项独立的服务,一项用于业务,一项用于使用 Spring OAuth 2 进行用户身份验证

我们将它们称为业务服务和 OAuth 服务。

现在,如果请求未经过身份验证,我希望将业务服务委托给 OAuth 服务。客户端应用程序(Android 应用程序)不应预先了解 OAuth 服务,它只能由业务服务委托给它,并针对未经身份验证的请求使用 302 HTTP 重定向。准确地说,我希望我的 API 登陆页面提供一个链接http://businessservice.com/login当我的客户端应用程序决定点击此链接时,它会被重定向到 OAuth 服务。

如果我用以下方式注释业务服务@EnableOAuth2Resource,当我在没有访问令牌的情况下卷曲它们时,它的所有资源都受到保护,返回 401。到目前为止,一切都很好。如果我提供这样的访问令牌:

curl -v http://localhost:8667/resource/ -H "Authorization: Bearer $TOKEN"

我可以访问资源。还好。

但是,如果我用以下方式注释业务服务@EnableOAuth2Sso为了启用到OAuth服务的重定向,它失去了使用访问令牌访问资源的能力(与上面相同的curl),它只向登录页面返回302http://localhost:8667/登录

如果我使用这两个注释,@EnableOAuth2Resource 似乎总是“获胜”,因为身份验证有效但调用http://localhost:8667/登录返回 404。

那么创建一个委托给身份验证服务器进行未经身份验证的调用的资源服务器的正确方法是什么?


经过几个小时的尝试后,我现在找到了解决方案。

业务服务器(资源服务器)现在如下所示:

@SpringBootApplication
@EnableOAuth2Sso
@EnableOAuth2Resource
public class BusinessService {

    public static void main(final String[] args) {
        final ConfigurableApplicationContext context = SpringApplication.run(BusinessService.class, args);
    }

}

有两种配置,一种用于 SSO:

@Configuration
public class OAuth2SsoConfiguration extends OAuth2SsoConfigurerAdapter {

    @Override
    public void match(final RequestMatchers matchers) {
        matchers.antMatchers("/");
    }

    @Override
    public void configure(final HttpSecurity http) throws Exception {
        http.authorizeRequests().anyRequest().permitAll();
    }

}

以及一个资源:

@Configuration
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(final HttpSecurity http) throws Exception {
        http.requestMatchers().antMatchers("/resource/**").and().authorizeRequests().anyRequest().authenticated().antMatchers("/").permitAll();

    }

}



结果如下:

curl -v http://localhost:8667/

returns

HTTP/1.1 200 OK
{"links":[{"rel":"login","href":"http://localhost:8667/login"}]}



curl -v http://localhost:8667/resource/

returns

HTTP/1.1 401 Unauthorized
{"error":"unauthorized","error_description":"Full authentication is required to access this resource"}



curl -v http://localhost:8667/login

returns

HTTP/1.1 302 Found
Location: http://localhost:8666/user/oauth/authorize?client_id=clientId&redirect_uri=http%3A%2F%2Flocalhost%3A8667%2Flogin&response_type=code&state=YmmNO9

因此,我的业务服务受到保护,资源服务器为所有业务资源返回 401。服务的根适用于所有客户端,因此他们可以发现登录关系,如果他们遵循此关系,他们将被重定向到授权服务器

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring OAuth:带有授权服务器后端的资源服务器 的相关文章

随机推荐

  • 如何在 php 中组合 2 个关联数组,以便在所有情况下都不会覆盖任何重复的条目?

    我有两个关联数组 它们有许多相同的内容 所以我想以这样的方式组合这两个数组 如果我有a在数组 1 和a在数组 2 中比在数组 3 中我应该有两个条目a s而不是 1 我尝试过使用 array merge 但如果第二个数组中有任何重复项 它会
  • rmagick 有没有办法转换内存中的图像

    From Rmagick guide 将图像转换为另一种格式 将图像转换为另一种格式就像编写 图像到文件 ImageMagick 使用输出文件名suffix jpg for JPEG gif for GIF for example or p
  • 在 shell 中一行运行多个命令

    说我有一个文件 templates apple我想要 把它放在两个不同的地方 然后 删除原件 So templates apple将被复制到 templates used AND templates inuse然后我想删除原来的 Is cp
  • gdb 中的 是否有问题?

    我有一个仅在 O2 优化中崩溃的应用程序 使用 gcc 4 2 4 编译 当我单步执行代码并到达崩溃的位置并尝试检查该值时 我在 gdb 中得到了 优化后的值 我在互联网上读到这意味着该值存储在寄存器中 我想知道我的崩溃是否可能与某些信息放
  • 您应该能够分配多少内存?

    背景 我正在编写一个处理大量地理数据的 C 程序 并希望一次性加载大块进行处理 我只能使用为 32 位机器编译的应用程序 我正在测试的机器运行 64 位操作系统 Windows 7 并拥有 6 GB 内存 使用 MS VS 2008 我有以
  • JSON 文件 - Java:编辑/更新字段值

    我的工作流程中有一些 JSONObject 并且通过将它们写入 json 文件来存储相同的 JSONObject 我想要一种有效的方法来更新 json 文件 仅在需要的字段 包含较新的 JSONObjects 实例的内容 Eg 我的档案里有
  • Java中InputStream.available()有什么作用?

    什么是InputStream available do in Java 我阅读了文档 但仍然无法理解 医生说 返回可以从此输入流读取 或跳过 的字节数 而不会被该输入流的方法的下一个调用者阻塞 下一个调用者可能是同一个线程或另一个线程 In
  • 地图在 python 3 中无法按预期工作

    这里是新手 此代码在 python 2 7 中有效 但在 3 3 中无效 def extractFromZipFiles zipFiles files toPath extractFunction lambda fileName zipFi
  • PHP 添加 2 个小数点数字(金钱)会得到错误的总金额结果

    我的 MySQL 数据库中有一个客户发票表 其中有一个名为 价格 的 DECIMAL 10 2 字段 当在 php 中获取这些值并计算总金额时 例如 在脚本中 totalAmount 0 initialised them to while
  • iOS - 从指数+模创建 SecKeyRef

    我想通过使用指数和模数作为私钥来解密 iPhone 上的 RSA 编码 blob 在 Java 使用 javax crypto 中 这可以通过如下代码轻松实现 1 key RSAPublicKeySpec keySpec new RSAPu
  • 使用 Maven 强制重新下载发布依赖项

    我正在开发一个依赖于 X 的项目 X 又依赖于 Y 我曾经在项目的 pom xml 中明确包含 Y 然而 它没有被使用 为了让事情变得更清晰 我将它作为依赖项添加到 X 的 pom 中 X 被标记为发布依赖项 问题是 从我的项目的 pom
  • 如何自动生成proguard-android.txt?

    阅读所有精彩的新事物Android 的 ProGuard 改进做 我切换到新方案取消注释在新创建的项目中添加以下行 proguard config sdk dir tools proguard proguard android txt pr
  • 控制 Magento API 调用的结果数量

    我有一个程序 用于通过 API 将 Magento 商店连接到后端库存控制系统 目前它的作用是查询 Magento API 中所有处于 Pending 状态的订单 将它们插入后端系统 然后将它们的状态设置为 Magento 中的 正在处理
  • 如何创建快捷方式以从命令行启动具有管理员权限的应用程序?

    我有一个安装程序 Inno Setup 它将我的应用程序安装到用户定义的路径 在安装例程结束时 我想创建一个以管理员权限启动应用程序的快捷方式 该解决方案适用于从 winXP 到 Win7 的所有 win 版本 我可以做什么来实现这个目标
  • 根据 Pandas 的条件重置累计总和

    我有一个像这样的数据框 customer spend hurdle A 20 50 A 31 50 A 20 50 B 50 100 B 51 100 B 30 100 我想计算累积的附加列 当累积总和大于或等于以下障碍时 该列将根据同一客
  • 函数隐式参数在传递给高阶函数后不再如此

    在 Scala 中 您可以执行以下操作 def foo implicit v Int println v def h x Int implicit val i Int x foo h 42 gt 42 h呼叫得到foo作为闭包的引用 尝试通
  • Django:ValueError:无法创建表单字段,因为尚未加载其相关模型

    我正在处理的 Django 项目遇到一些问题 我现在有两个应用程序 它们需要相当多的重叠 我真的只开始了第二个项目 称为workflow 我正在尝试为该申请制作第一份表格 我的第一个应用程序叫做po 在里面workflow应用程序我有一个名
  • “cout << cout” - 输出代表什么?

    经过一整天的编码后 我不小心写了 cout lt lt some text lt lt cout 代替 cout lt lt some text lt lt endl 现在它打印出一个内存地址 它指向什么 std cout是一个实例std
  • 如何使用 matplotlib.pyplot 更改图例字体大小

    这里有一个简单的问题 我正在尝试使用以下方法获取图例的大小matplotlib pyplot变小 即文本变小 我正在使用的代码是这样的 plot figure plot scatter k sum cf color black label
  • Spring OAuth:带有授权服务器后端的资源服务器

    我想开发两项独立的服务 一项用于业务 一项用于使用 Spring OAuth 2 进行用户身份验证 我们将它们称为业务服务和 OAuth 服务 现在 如果请求未经过身份验证 我希望将业务服务委托给 OAuth 服务 客户端应用程序 Andr