KeyCloak服务器引发的问题:java.lang.ClassNotFoundException: java.security.acl.Group。

27
我正在运行一个KeyCloak服务器,用于验证想要访问Spring Boot / Spring Web REST API的用户。然而,在尝试进行身份验证时出现错误。
以下操作有效:
- 当我访问http://localhost:8080/path/to/restapi时 - 我会像预期的那样看到一个登录屏幕: -- KeyCloak登录屏幕 - 当我单击登录时,浏览器重定向时会出现以下错误:
Whitelabel Error Page This application has no explicit mapping for /error, so you are seeing this as a fallback.
这是打印到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

KeyCloak服务器显示用户对应用程序的会话处于活动状态。然而,由于上述缺失的类,认证过程从未完成。


我遇到了同样的问题,但升级到JDK 11并没有解决它。我也降级到JDK 8,但仍然无法解决。当我将其部署到Docker Swarm服务时,我也遇到了这个问题。在本地,我的Springboot服务运行良好。有任何解决方法吗? - spoilerd do
6个回答

37

经过一番研究,我找到了解决问题的方法。

问题是由于JRE 9中已经开始弃用 java.security.acl.Group 类,并标记为将来的版本中将移除该类。

java.security.acl.Group 已被 java.security.Policy 替代

在 JRE 14 上运行我的 Spring-Boot 应用程序时,该类似乎已不再可用。

所以,一旦我将主机 REST-API 的 Spring-boot 应用程序更改为使用 JRE 11,错误就消失了。

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


2
好的研究。如果您还没有尝试过,请尝试更新Spring Boot。在新的Java版本中,保持最新的依赖关系通常可以解决问题。 - Nicolai Parlog
7
除了降级Java,还有其他解决方案吗? - pavlee
1
我在尝试在JDK 15上运行apicurio-studio时遇到了相同的问题。降级到11就可以了。 - Jeff
我之前也遇到了同样的问题,但在安装了Java 11之后,问题得到了解决。 - Ercan Celik
使用最新版本的Keycloak 12.0.4,并且遇到了这个问题。在Java 11、8上,有什么想法出了问题吗? - Shamil Puthukkot

17

10
很高兴看到Keycloak 11已经发布了。不幸的是,他们把这个问题的修复版本转移到了Keycloak 12。 - Lars
5
更新:他们已经转而使用 Keycloak 13 对其进行修复。 https://github.com/keycloak/keycloak/pull/7533 - Giovane
Keycloak 13已经发布,我这个星期会尝试使用它。我们切换到Jetty以在Java 15下运行,希望Tomcat也能在新版本下正常工作。 - Dmitriy Popov
似乎已经在Java客户端版本“13.0.0”中修复。现在可以在Tomcat和Java 15下正常工作。 - Dmitriy Popov

8

我通过保留JDK 14而将Tomcat切换为使用Spring Boot的Jetty来解决此问题。Jetty从9.4.x版本开始移除了对此已弃用的类java.security.acl.Group的使用。请参见此处: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>

1
谢谢你的回答。我尝试了,但是应用程序现在出现了错误:org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'securityConfiguration': Unsatisfied dependency expressed through field 'keycloakConfigResolver'; nested exception is org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'keycloakConfigResolver': Requested bean is currently in creation: Is there an unresolvable circular reference? - Dmitriy Popov
圆形依赖关系存在于我的类public class SecurityConfiguration extends KeycloakWebSecurityConfigurerAdapter { }中。 - Dmitriy Popov
2
请注意:我在我的public class SecurityConfiguration extends KeycloakWebSecurityConfigurerAdapter上将@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)更改为@ComponentScan(basePackageClasses = KeycloakSpringBootConfigResolver.class),以解决循环依赖的问题。 - Dmitriy Popov

2

我在Java 15和Keycloak 15.0.2中遇到了相同的错误。 - sarath

0
在我的情况下,SpringBoot应用程序使用的是Java 17, 2023-10-05 19:06:13.526 INFO 14332 --- [ restartedMain] com.souqh.SouqhbeApplication : 正在启动SouqhbeApplication,使用Java 17.0.3,在ENCDAPPUNLT0210上的PID 14332 (F:\souqh\souqhbe\bin\main started by Ajinkya.Patil in F:\souqh\souqhbe)
我将安装的JRE从17更改为11,这对我起作用了 您可以按照下面的链接来更改Eclipse中安装的JRE https://simply-how.com/getting-started-with-java-11#section-3

0

只需切换到jdk 1.8以适用于keycloak:legacy,它就可以完美地工作了


尽管这并没有解决问题,但这是一个临时的解决方案。这对我起作用了,现在没有错误了。Keycloak按预期工作。 - Seyon Seyon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接