Keycloak:无法在 Spring Boot 应用程序中加载 URL

2023-11-21

我目前正在尝试开发一个使用 keycloak 保护的 Spring Boot Rest Api。

当我尝试调用必须识别用户的 api 时,出现错误。

错误信息如下:

2020-04-10 16:09:00.324  WARN 44525 --- [nio-8080-exec-7] 
o.keycloak.adapters.KeycloakDeployment   : Failed to load URLs from 
https://{{keycloakserver}}.de/auth/realms/{{realm}}/.well-known/openid-configuration

java.lang.RuntimeException: java.lang.RuntimeException: Stub!
at org.keycloak.adapters.KeycloakDeployment.getClient(KeycloakDeployment.java:327) [keycloak-adapter-core-9.0.2.jar:9.0.2]
at org.keycloak.adapters.KeycloakDeployment.getOidcConfiguration(KeycloakDeployment.java:219) [keycloak-adapter-core-9.0.2.jar:9.0.2]
at org.keycloak.adapters.KeycloakDeployment.resolveUrls(KeycloakDeployment.java:178) [keycloak-adapter-core-9.0.2.jar:9.0.2]
at org.keycloak.adapters.KeycloakDeployment.getRealmInfoUrl(KeycloakDeployment.java:232) [keycloak-adapter-core-9.0.2.jar:9.0.2]
at org.keycloak.adapters.rotation.AdapterTokenVerifier.createVerifier(AdapterTokenVerifier.java:107) [keycloak-adapter-core-9.0.2.jar:9.0.2]
at org.keycloak.adapters.rotation.AdapterTokenVerifier.verifyToken(AdapterTokenVerifier.java:47) [keycloak-adapter-core-9.0.2.jar:9.0.2]
at org.keycloak.adapters.BearerTokenRequestAuthenticator.authenticateToken(BearerTokenRequestAuthenticator.java:103) [keycloak-adapter-core-9.0.2.jar:9.0.2]
at org.keycloak.adapters.BearerTokenRequestAuthenticator.authenticate(BearerTokenRequestAuthenticator.java:88) [keycloak-adapter-core-9.0.2.jar:9.0.2]
at org.keycloak.adapters.RequestAuthenticator.authenticate(RequestAuthenticator.java:67) [keycloak-adapter-core-9.0.2.jar:9.0.2]
at org.keycloak.adapters.springsecurity.filter.KeycloakAuthenticationProcessingFilter.attemptAuthentication(KeycloakAuthenticationProcessingFilter.java:154) [keycloak-spring-security-adapter-9.0.2.jar:9.0.2]
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.keycloak.adapters.springsecurity.filter.KeycloakPreAuthActionsFilter.doFilter(KeycloakPreAuthActionsFilter.java:96) [keycloak-spring-security-adapter-9.0.2.jar:9.0.2]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:97) [spring-web-5.1.10.RELEASE.jar:5.1.10.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) [spring-web-5.1.10.RELEASE.jar:5.1.10.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:74) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) [spring-web-5.1.10.RELEASE.jar:5.1.10.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) [spring-security-web-5.1.6.RELEASE.jar:5.1.6.RELEASE]

我不知道什么Failed to load URLs from方法。当我单击链接并显示配置文件时,我可以访问这一侧。

Setup

钥匙斗篷:

Keycloak 服务器位于网络中,因此没有本地主机。

我创建了一个领域(测试领域)
我创建了一个客户端(测试客户端)
我创建了一个用户(测试用户)
我在客户端(ADMIN)创建了一个角色
我已将角色(ADMIN)分配给用户(测试用户)

客户端的客户端协议是openid-connect访问类型是confidental.

春季启动:

Spring Boot Rest 应用程序在 localhost:8080 上运行。

我添加在applications.properties以下 keycloak 配置。

keycloak.realm={{test-realm}}
keycloak.auth-server-url = https://{{keycloakserver}}.de/auth
keycloak.resource = {{test-client}}
keycloak.ssl-required=external
keycloak.bearer-only=true
keycloak.principal-attribute=preferred_username
keycloak.use-resource-role-mappings = true

为了确保测试用户只能访问一个 api 调用,我使用了以下配置。

 @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http.authorizeRequests()
                .antMatchers("/getTest")
                .hasRole("ADMIN")
                .anyRequest()
                .authenticated();
    }

Tests

当我打电话时http://localhost:8080/getTest与邮递员我得到了正确的401 Unauthorized.

然后我调用了相同的 URLAuthorization以及登录的访问令牌test-user.

通过第二次调用,我收到上面的错误消息。

有人知道这件事吗? 如果我遗漏了您需要知道的配置值,请询问。

感谢您的帮助。

Edit:

安全配置.java

import org.keycloak.adapters.KeycloakConfigResolver;
import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver;
import org.keycloak.adapters.springboot.KeycloakSpringBootProperties;
import org.keycloak.adapters.springsecurity.KeycloakConfiguration;
import org.keycloak.adapters.springsecurity.KeycloakSecurityComponents;
import org.keycloak.adapters.springsecurity.authentication.KeycloakAuthenticationProvider;
import org.keycloak.adapters.springsecurity.config.KeycloakWebSecurityConfigurerAdapter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.authority.mapping.SimpleAuthorityMapper;
import org.springframework.security.core.session.SessionRegistryImpl;
import org.springframework.security.web.authentication.session.RegisterSessionAuthenticationStrategy;
import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;

/**
 * Created by johannes on 07.04.20 for test App.
 */
@EnableWebSecurity
@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
@Configuration
@KeycloakConfiguration
public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider();
        auth.authenticationProvider(keycloakAuthenticationProvider);
    }

    @Bean
    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new RegisterSessionAuthenticationStrategy(
                new SessionRegistryImpl());
    }

    @Bean
    @Primary
    public KeycloakConfigResolver keycloakConfigResolver(KeycloakSpringBootProperties properties) {
        return new CustomKeycloakSpringBootConfigResolver(properties);
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http.authorizeRequests()
                .antMatchers("/getTest")
                .hasRole("ADMIN")
                .anyRequest()
                .authenticated();
    }
}

自定义KeycloakSpringBootConfigResolver:

import org.keycloak.adapters.KeycloakDeployment;
import org.keycloak.adapters.KeycloakDeploymentBuilder;
import org.keycloak.adapters.spi.HttpFacade;
import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver;
import org.keycloak.adapters.springboot.KeycloakSpringBootProperties;
import org.springframework.context.annotation.Configuration;

/**
 * Created by johannes on 10.04.20 for test App.*/
@Configuration
public class CustomKeycloakSpringBootConfigResolver extends KeycloakSpringBootConfigResolver {
        private final KeycloakDeployment keycloakDeployment;
    public CustomKeycloakSpringBootConfigResolver(KeycloakSpringBootProperties properties) {

        keycloakDeployment = KeycloakDeploymentBuilder.build(properties);
    }

    @Override
    public KeycloakDeployment resolve(HttpFacade.Request facade) {
        return keycloakDeployment;
    }
}

TestController.java(这只是测试 getter):

  @GetMapping("/getTest")
    public @ResponseBody ResponseEntity getTest() {

        return ResponseEntity.status(ResponseValues.ITEMDELETEFAILED.getResponseCode()).body(ResponseValues.ITEMDELETEFAILED.getResponseMessage());

    }

请求是通过邮递员发出的,这是代码:

curl --location --request GET 'http://localhost:8080/getTest' \
--header 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUI...' \
--header 'Cookie: JSESSIONID=41E8E82178FA181817...'

我也有同样的问题,我尝试在google、stackoverflow等上寻找答案......

最后,我抓住了线索,要让它发挥作用,只需去除pathkeycloak.auth-server-url as http://192.168.0.119:8080代替http://192.168.0.119:8080/auth或者是其他东西.

...   : Loaded URLs from http://192.168.0.119:8080/realms/spmia-realm/.well-known/openid-configuration
keycloak.realm=spmia-realm
keycloak.auth-server-url=http://192.168.0.119:8080
keycloak.ssl-required=external
keycloak.resource=ostock
keycloak.credentials.secret=FnUBprsgArHa7PkmR9HPWeXY0nJ22Ks1
keycloak.use-resource-role-mappings=true
keycloak.bearer-only=true
...
  keycloak:
    image: quay.io/keycloak/keycloak:18.0
    restart: on-failure
    environment:
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: admin
      KC_DB: postgres
      KC_DB_USERNAME: keycloak
      KC_DB_PASSWORD: keycloak
      KC_DB_URL: jdbc:postgresql://database:5432/keycloak
    command:
      - "start-dev"
    depends_on:
      database:
        condition: service_healthy
    ports:
      - "8080:8080"
...
...
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.keycloak</groupId>
            <artifactId>keycloak-spring-boot-starter</artifactId>
        </dependency>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.keycloak.bom</groupId>
                <artifactId>keycloak-adapter-bom</artifactId>
                <version>18.0.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Keycloak:无法在 Spring Boot 应用程序中加载 URL 的相关文章

随机推荐

  • 如何将 AKSequencer 连接到 AKCallbackInstrument?

    我想读取 MIDI 文件并在触发音符事件时显示内容 我发现了这个 stackoverflow 问题 其中第二个答案建议使用 AudioKit 如何为我的音频应用程序获得可靠的计时 更准确地说 建议使用 AKSequencer 吸收应用程序中
  • ios 11 导航栏重叠状态栏

    在 ios 11 中 导航栏与状态栏重叠 如果有人遇到同样的问题 请提供帮助 不确定这是否是同样的问题 但我们在升级到 iOS 11 时也遇到了这个问题 See ios 11 自定义导航栏位于状态栏下方 我们手动将导航栏高度设置为 64 并
  • Spring MVC JavaConfig webapp 中的“错误页面”配置? (没有 web.xml)

    我将如何使用 Java 配置向 Spring MVC Web 应用程序添加 错误页面 类型配置 没有 web xml
  • Apache Flink - 如果 x 分钟内没有收到数据,则发送事件

    如何使用 Flink 的 DataStream API 实现一个运算符 以便在一段时间内没有从流中接收到数据时发送事件 这样的运算符可以使用ProcessFunction DataStream
  • 第一个实体框架 6 nonquery 的六秒预热时间

    从我的集成测试来看 Act Stopwatch w new Stopwatch w Start userService Create userDTO w Stop public void Create UserDTO userDTO var
  • 如何让我的 Chrome 扩展程序只注入一次脚本?

    我在用着程序化注入仅在单击浏览器操作时将我的扩展程序的代码注入页面 这就是我的扩展中的内容活动页面 根据中的示例文档 chrome browserAction onClicked addListener function callback
  • JQuery ajax 调用 httpget webmethod (c#) 不起作用

    我试图让 ajax 访问后面代码中的 webmethod 问题是我不断从 jQuery 收到错误 parserror onfail method 如果我将 GET 更改为 POST 一切正常 请参阅下面我的代码 阿贾克斯调用
  • 有reactive-banana-gtk吗?

    我找到了reactive banana wax 想知道是否还有一个类似的gtk包 因为reactive香蕉应该支持gtk 根据http www haskell org haskellwiki Reactive banana The reac
  • 用于诊断 .NET 中内存泄漏的工具(ASP.NET 应用程序)[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我们需要一个工具来轻松检测 ASP NET 应用程序中的内存泄漏 我们有一个应用程序 它消耗大量内存 Thanks Using WinDbg不像使用
  • Thread.CurrentPrincipal.Identity vs HttpContext.User.Identity [重复]

    这个问题在这里已经有答案了 可能的重复 http context user 和 thread currentprincipal 之间的区别以及何时使用它们 这两者在 ASP NET 应用程序中有何区别 我知道HttpContext User
  • 如何将 CSS 用于 Vaadin 组件?

    我似乎看到了一些例子 人们回答了如何通过添加 CSS 代码从组件中获取某些特定行为的问题 但是似乎没有人解释如何使用该 CSS 代码将其连接到 Java 组件 v table body overflow hidden important 例
  • 一个目录中的多个 Git 存储库

    我想将一个目录部署给具有不同权限的多个开发人员 所以这是 Git 无法做到的一件事 如何在一个目录中创建两个存储库 并通过使用排除由另一个存储库管理的文件来为它们分配不同的文件列表 gitignore file 例子 www project
  • MySQL“NOT IN”查询3个表

    我有 3 个表格课程 成绩和评估 我想比较两个表的等级和评价 如果表等级中的数据在表评价中不存在 则该数据会出现 输出 select Grade ID Courses Course ID Courses Grade NAME Course
  • 如何使用 6 个按钮(如 Windows 磁贴)创建布局

    我正在尝试创建一个包含 6 个按钮的布局 可以像 Windows Phone 的平铺一样自动适应屏幕尺寸 在代码中 我动态创建了 6 个按钮 2 个用于行 但按钮应该适合填充后者的屏幕大小 我该如何继续
  • 在动态分配的二维数组上使用 realloc() 是个好主意吗?

    我主要对它的可行性感兴趣缩小这样的数组 我正在开发一个项目 其中我使用单个 malloc 调用来每个创建单独的中等大小的二维数组 每个阵列最多只有几十 MiB 问题是 在其中一个阵列的生命周期内 其内容的大小会急剧缩小 减少一半以上 显然
  • 了解合并排序优化:避免复制

    我在算法书中有下面的合并排序程序 其中提到主要问题是合并两个排序列表需要线性额外内存 并且在整个算法中复制到临时数组并返回所花费的额外工作会减慢速度大幅下降 通过在递归的交替级别明智地切换 a 和 tmp array 的角色可以避免这种复制
  • NVD3.js:ReferenceError:nv 未定义

    我正在使用 NVD3 js 库来生成图形 我尝试向其中添加折线图并收到上述错误 如何解决呢 我正在尝试这个here 实际上我发现问题出在文件夹结构上 Angular nvd3 网站附带的示例给出了路径 Bower components nv
  • Bootstrap 3 - 连续使用超过 12 列

    我遇到了一种情况 要求我不要限制一行中的列数 因为可能会将多个内容块从管理中的位置添加到该区域 默认情况下 BS3 的行为告诉 12 列 div 不要浮动 这会导致它们越过较小的浮动 div 的顶部 因此 我为我的系统编写了一个覆盖作为一个
  • 为什么我不能覆盖 `Array` 的原型 (`Array.prototype`)?

    我设定的原型是Array作为一个例子my 我认为book aa将显示 aa 但它显示 undefined 为什么 谢谢 h2 Array Properties h2
  • Keycloak:无法在 Spring Boot 应用程序中加载 URL

    我目前正在尝试开发一个使用 keycloak 保护的 Spring Boot Rest Api 当我尝试调用必须识别用户的 api 时 出现错误 错误信息如下 2020 04 10 16 09 00 324 WARN 44525 nio 8