KeyCloak 服务器引起:java.lang.ClassNotFoundException:java.security.acl.Group

Posted

技术标签:

【中文标题】KeyCloak 服务器引起:java.lang.ClassNotFoundException:java.security.acl.Group【英文标题】:KeyCloak Server Caused by: java.lang.ClassNotFoundException: java.security.acl.Group 【发布时间】:2020-09-07 22:42:47 【问题描述】:

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

以下作品:

当我访问http://localhost:8080/path/to/restapi 我按预期显示了一个登录屏幕: --KeyCloak Login Screen 当我点击登录时,从我的浏览器中重定向时出现以下错误:

白标错误页面 此应用程序没有 /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

KeyCloak 服务器显示用户与应用程序的会话处于活动状态。但是,由于上述缺少类,身份验证过程从未完成。

【问题讨论】:

我遇到了同样的问题,但升级到 JDK 11 并没有解决它。我也降级到 JDK 8,但也没有用。在将其部署到 docker swarm 服务时,我也遇到了这个问题。在本地,我的 Springboot 服务运行良好。有什么解决办法吗? 【参考方案1】:

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

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

java.security.acl.Group is being replaced by java.security.Policy

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

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

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

【讨论】:

很好的研究。 ??小记,万一你还没试过,看看能不能更新Spring Boot。在新的 Java 版本上,拥有最新的依赖项通常可以解决问题。 除了降级Java,还有其他解决方案吗? 我在尝试在 JDK 15 上运行 apicurio-studio 时遇到了同样的问题。降级到 11 有效。 我遇到了同样的问题,安装 java 11 后,问题解决了。 使用最新版本的 keycloak 12.0.4 并面临此问题。在 java 11,8 上。知道出了什么问题吗?【参考方案2】:

遇到了同样的问题。

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

应该在 keycloak 11 中修复。

【讨论】:

很高兴看到 Keycloak 11 刚刚发布。不幸的是,他们将此问题的 FIX 版本切换到 Keycloak 12。 更新,他们转而将其修复为 Keycloak 13 github.com/keycloak/keycloak/pull/7533 Keycloak 13 出来了,我这周试试。我们切换到 Jetty 以在 Java 15 下运行,希望 Tomcat 能够在新版本下再次运行。 似乎已在版本 13.0.0 的 Java 客户端工件中得到修复。它现在可以在 Tomcat 和 Java 15 下运行。【参考方案3】:

我能够通过保留 JDK 14 但使用 Spring Boot 从 Tomcat 切换到 Jetty 来摆脱这个问题。从 9.4.x 开始,Jetty 删除了这个已弃用的类 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>

【讨论】:

感谢您的回答。我试过了,但应用程序现在失败了 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? 循环依赖与我的班级public class SecurityConfiguration extends KeycloakWebSecurityConfigurerAdapter 仅供参考:我通过将 public class SecurityConfiguration extends KeycloakWebSecurityConfigurerAdapter 上的 @ComponentScan(basePackageClasses = KeycloakSecurityComponents.class) 更改为 @ComponentScan(basePackageClasses = KeycloakSpringBootConfigResolver.class) 解决了循环依赖问题。【参考方案4】:

查看最新的适配器版本。这应该使用版本 >= 13.0

修复 问题跟踪器:KEYCLOAK-13633 PR on GitHub

【讨论】:

我在使用 Keycloak 15.0.2 的 Java 15 中遇到了同样的错误

以上是关于KeyCloak 服务器引起:java.lang.ClassNotFoundException:java.security.acl.Group的主要内容,如果未能解决你的问题,请参考以下文章

由于以下原因导致的错误:java.lang.ClassNotFoundException Keycloak

java.lang.IllegalStateException:当我尝试将 keycloak 与 spring boot web + spring security 项目集成时,当前用户主体不是类型

引起:java.lang.IllegalArgumentException:模式不能为空或为空

java.lang.AssertionError:不可能引起:java.lang.NoSuchMethodException:值[]

引起:java.lang.IllegalArgumentException:坏类:类 java.lang.String

引起:java.lang.IllegalArgumentException:属性'driverClassName'不能为空