Spring Security:不同路径的多个 OpenID Connect 客户端?

2024-02-17

使用 Spring Boot 2.1.5 和 Spring Security 5,我尝试使用两个不同的 OpenID 客户端(基于 Keycloak)。这是我们所拥有的application.properties.

spring.security.oauth2.client.registration.keycloak-endusersclient.client-id=endusersclient
spring.security.oauth2.client.registration.keycloak-endusersclient.client-secret=7b41aaa4-277f-47cf-9eab-91afacd55d2c
spring.security.oauth2.client.provider.keycloak-endusersclient.issuer-uri=https://mydomain/auth/realms/endusersrealm

spring.security.oauth2.client.registration.keycloak-employeesclient.client-id=employeesclient
spring.security.oauth2.client.registration.keycloak-employeesclient.client-secret=7b41aaa4-277f-47cf-9eab-91afacd55d2d
spring.security.oauth2.client.provider.keycloak-employeesclient.issuer-uri=https://mydomain/auth/realms/employeesrealm

您可以从上面的代码片段中看到,我们尝试为最终用户(客户)使用一个 OpenID 客户端,为员工使用另一个 OpenID 客户端。

在安全配置类中,我们看到如何在不同模式上配置安全性,如下所示:

public class OpenIDConnectSecurityConfig extends
WebSecurityConfigurerAdapter
{
    @Override
    protected void configure(HttpSecurity http) throws Exception {

    // avoid multiple concurrent sessions
    http.sessionManagement().maximumSessions(1);


    http.authorizeRequests()
            .antMatchers("/endusers/**").authenticated()
            .antMatchers("/employees/**").authenticated()
            .anyRequest().permitAll().and()
            .oauth2Login()
            .successHandler(new OpenIDConnectAuthenticationSuccessHandler())
            .and()
            .logout().logoutSuccessUrl("/");

我不明白的是如何配置每个 OpenID 客户端以触发单独的 URL 模式。在上面的示例中,我们希望看到在点击以“/endusers”开头的 URL 时使用最终用户客户端,并在点击以“/employees”开头的 URL 时使用员工客户端。

这可以做到吗?


对于多租户情况,您需要使用 AuthenticationManagerResolver,其中 endusersclient 和Employeesclient 是您的租户。

public class CustomAuthenticationManagerResolver implements AuthenticationManagerResolver<HttpServletRequest> {


@Override
public AuthenticationManager resolve(HttpServletRequest request) {
    return fromTenant();
}

private AuthenticationManager fromTenant(HttpServletRequest request) {
            String[] pathParts = request.getRequestURI().split("/");
//TODO find your tanent from the path and return the auth manager
}

// 在你的班级中,它应该像下面这样

private CustomAuthenticationManagerResolver customAuthenticationManagerResolver;

http.authorizeRequests()
        .antMatchers("/endusers/**").authenticated()
        .antMatchers("/employees/**").authenticated()
        .anyRequest().permitAll().and().oauth2ResourceServer().authenticationManagerResolver(this.customAuthenticationManagerResolver);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Security:不同路径的多个 OpenID Connect 客户端? 的相关文章

随机推荐

  • Spring 3.1.1 与 hibernate 4.1 注解配置

    我正在使用 spring3 1 1 和 hibernate 4 1 设置新项目 当我运行我的项目时 出现以下错误 java lang NoSuchMethodError org hibernate SessionFactory getCur
  • 获取Redis集群中所有key

    我使用的是Redis集群版本redis 5 0 5 我想查看 Redis 集群中存在的所有密钥 我知道我们使用独立的KEYS 获得所有钥匙 如何查看Redis集群中的所有键 redis cli h hostname p 90001 c ho
  • 如何托管我自己的私有 conda 存储库?

    我有几个相互依赖的 python 项目 我为每个项目都有不同的发行版本 不同的项目可能依赖于特定项目的不同发行版本 我想在内部服务器上创建自己的 conda 存储库 在其中我可以将这些项目的版本作为 conda 包推送 其他项目可以从那里安
  • window.location.href 与单击锚点

    点击有什么区别 a href href a vs calling window location href 只要有可能 您应该使用 a href foo html over window location href 有很多很好的理由 如果您
  • 有没有办法检查缓冲区是否采用 Brotli 压缩格式?

    我是一名实习生 正在研究在软件中使用 Brotli 压缩是否可以比当前版本 使用 GZip 带来性能提升 我的任务是使用 GZip 更改任何内容以使用 Brotli 压缩 我需要替换的一个函数会检查缓冲区是否包含使用 GZip 压缩的数据
  • 在 Python 中处理非常大的数字

    我一直在考虑用 Python 进行快速扑克牌评估 我突然想到 加快该过程的一种方法是将所有牌面和花色表示为素数 并将它们相乘以表示手牌 至惠特 class PokerCard faces 23456789TJQKA suits cdhs f
  • NodeJs如何在控制台中显示结构化表格

    不安装新包可以吗 Here i am using cli table package 有什么简单的方法可以做到吗 您可以使用控制台 表 https developer mozilla org en US docs Web API Conso
  • 如何在 create-react-app 中更新 Jest 测试框架?

    我已经创建了一个应用程序create react app https github com facebookincubator create react app包裹 我发现 Jest 版本 15 1 1 存在错误 但我意识到在版本 16 中
  • 函数模板的显式实例化失败 (g++)

    我在函数模板的显式实例化方面遇到一些问题 即链接错误 在Visual Studio下项目链接正常 仅在g Unix下 使用Eclipse CDT 链接产生错误 在一个大项目中 函数调用是静态库的一部分 它与动态库链接 函数架构如下 函数模板
  • 如何从 FilterAttribute 中获取当前 Url?

    我正在编写一个授权过滤器属性 但我无法弄清楚如何以字符串形式获取当前 url 以便我可以将其作为参数传递给 LogOn 操作 目标是 如果用户成功登录 他们将被重定向到他们最初尝试访问的页面 public override void OnA
  • 将 Python None 转换为 JavaScript null

    在 Django 视图中 我生成一个如下所示的数据集 data 22 23 18 19 21 None 22 20 我使用以下方法将此数据传递给 JavaScript 变量 data json simplejson dumps data 用
  • 从 S3 下载文件时 AWS Lambda 中出现“只读文件系统”错误

    当我将 file csv 放入 S3 存储桶时 我在 lambda 函数中看到以下错误 该文件并不大 我什至在打开文件进行读取之前添加了 60 秒的睡眠时间 但由于某种原因 该文件附加了额外的 6CEdFe7C 这是为什么 Errno 30
  • 使用电子邮件和密码验证用户身份

    我有一个只允许用户通过 username 登录的表单 我决定只允许用户通过电子邮件而不是用户名登录 首先 这不是与通过电子邮件登录相关的任何问题的重复 因为在我的场景中 我验证并验证了用户forms py在他继续在视图中进行最终登录之前 这
  • 协议缓冲区 Java RPC 堆栈

    根据this http en wikipedia org wiki Protocol Buffers维基百科条目 Protocol Buffers 与 Facebook 的 Thrift 协议非常相似 只是它不包含用于定义服务的具体 RPC
  • Flutter:如何允许内容重叠 SliverAppBar?

    在android中我们使用的是app behavior overlapTop 64dp 为了达成这个 我想要重叠内容与上面的 flutter 中的 GIF 相同 My code class DetailsPage extends State
  • 通过分割视图控制器使用多个详细视图

    如您所知 一个UISplitViewController只有一个根控制器和一个详细视图控制器 但我想使用另一个详细视图控制器 当我从根控制器 弹出窗口控制器 中选择列表项时 选择应该触发不同的详细视图 即 row1 触发详细视图 1 row
  • 在 Blazor WebAssembly 客户端应用程序中使用 Serilog 作为日志记录提供程序

    我想在客户端和服务器端的 blazor web assembly net 6 应用程序中使用 serilog 在本文 https nblumhardt com 2019 11 serilog blazor 我发现了如何将日志条目中继到服务器
  • 运算符 << 和继承

    我有以下 C 类 class Event friend ofstream operator lt lt ofstream ofs Event e class SSHDFailureEvent public Event friend ofst
  • 从 glTexStorage3D 切换到 glTexImage3D

    glBindTexture GL TEXTURE 2D ARRAY texture id glTexStorage3D GL TEXTURE 2D ARRAY 1 No mipmaps GL RGBA8 Internal format wi
  • Spring Security:不同路径的多个 OpenID Connect 客户端?

    使用 Spring Boot 2 1 5 和 Spring Security 5 我尝试使用两个不同的 OpenID 客户端 基于 Keycloak 这是我们所拥有的application properties spring securit