KeyCloak 服务器导致:java.lang.ClassNotFoundException:java.security.acl.Group

Rei*_*ens 18 classnotfoundexception spring-boot keycloak java-11 java-14

我正在运行 KeyCloak 服务器来验证想要访问 Spring Boot/Spring Web REST API 的用户。但是,尝试进行身份验证时发生错误。

以下工作:

  • 当我访问 http://localhost:8080/path/to/restapi
  • 我得到了预期的登录屏幕: -- KeyCloak 登录屏幕
  • 当我单击登录时,浏览器中的重定向发生以下错误:

白标错误页面 此应用程序没有明确的 /error 映射,因此您将其视为后备。

这是打印到 Spring Boot 控制台的错误:

Caused by: java.lang.ClassNotFoundException: java.security.acl.Group
  at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602) ~[na:na]
  at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178) ~[na:na]
  at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522) ~[na:na]
  ... 33 common frames omitted
Run Code Online (Sandbox Code Playgroud)

KeyCloak 服务器显示该会话对于该应用程序的用户来说是活动的。但是,由于上述缺少的类,认证过程永远不会完成。

Rei*_*ens 29

经过一番研究,我找到了我的问题的答案。

问题是 java.security.acl.Group 自 JRE 9 以来已被弃用,并标记为在未来版本中删除。

java.security.acl.Group 被 java.security.Policy 取代

我在 JRE 14 上运行我的 Spring-Boot 应用程序,其中这个类似乎不再可用。

因此,一旦我将 Spring-boot 应用程序(托管 REST-API)更改为使用 JRE 11,错误就消失了。

注意:<java.version>11</java.version>需要更改的 pom.xml Java 版本属性以及 Eclipse 中构建路径中的 JDK(这是我正在使用的 IDE)JDK Buildpath

  • 除了降级 Java 之外,还有其他解决方案吗? (4认同)
  • 很好的研究。如果您还没有尝试过,请注意一下是否可以更新 Spring Boot。在新的 Java 版本上,拥有最新的依赖项通常可以解决问题。 (2认同)

Sté*_*ane 14

遇到了同样的问题。

顺便说一下,它在此处的 keycloak 问题跟踪器中报告:https ://issues.redhat.com/browse/KEYCLOAK-13690

应该在keycloak 11中修复。

  • 我很高兴看到 Keycloak 11 刚刚发布。不幸的是,他们将此问题的修复版本切换到了 Keycloak 12。 (10认同)
  • 更新,他们将其修复到 Keycloak 13 https://github.com/keycloak/keycloak/pull/7533 (5认同)

Aay*_*ush 5

我能够通过保留 JDK 14 但使用 Spring Boot 从 Tomcat 切换到 Jetty 来解决这个问题。java.security.acl.Group从 9.4.x 开始,Jetty 删除了这个弃用类的使用。请参阅此处:https : //github.com/eclipse/jetty.project/issues/3394。您必须小心选择正确的库版本,spring-boot-starter-jetty以查看它是否已经在下面使用 Jetty 9.4+。

这是从嵌入式 Tomcat 切换到 Jetty 的方式:

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
      <exclusions>
        <!-- Exclude the Tomcat dependency -->
        <exclusion>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <!-- Add Jetty as a replacement -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-jetty</artifactId>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考:我通过将“公共类 SecurityConfiguration 扩展 KeycloakWebSecurityConfigurerAdapter”上的“@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)”更改为“@ComponentScan(basePackageClasses = KeycloakSpringBootConfigResolver.class)”来解决循环依赖关系。 (2认同)