Play-pac4j与Play 2.5:@RequiresAuthentication注释导致stacktrace

时间:2016-03-30 13:35:03

标签: java authentication sbt playframework-2.5


我目前与 play-pac4j 库以及 Play Framework 2.5 结合起来。

注释:

@RequiresAuthentication(clientName = "FacebookClient")
我的控制器方法中的

会导致此堆栈跟踪:

`

java.lang.NoClassDefFoundError: play/libs/F$Function
        at java.lang.Class.getDeclaredConstructors0(Native Method)
        at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
        at java.lang.Class.getDeclaredConstructors(Class.java:2020)
        at com.google.inject.spi.InjectionPoint.forConstructorOf(InjectionPoint.java:245)
        at com.google.inject.internal.ConstructorBindingImpl.create(ConstructorBindingImpl.java:99)
        at com.google.inject.internal.InjectorImpl.createUninitializedBinding(InjectorImpl.java:658)
        at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:882)
        at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:805)
        at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:282)
        at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:214)
Caused by: java.lang.ClassNotFoundException: play.libs.F$Function
        at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.Class.getDeclaredConstructors0(Native Method)
        at java.lang.Class.privateGetDeclaredConstructors(Class.java:2671)
        at java.lang.Class.getDeclaredConstructors(Class.java:2020)
        at com.google.inject.spi.InjectionPoint.forConstructorOf(InjectionPoint.java:245)
        at

com.google.inject.internal.ConstructorBindingImpl.create(ConstructorBindingImpl.java:99)                 在com.google.inject.internal.InjectorImpl.createUninitializedBinding(InjectorImpl.java:658

)
            at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:882)

`

这是我用于依赖的build.sbt的片段:

libraryDependencies ++= Seq(
      "org.pac4j" % "play-pac4j" % "2.1.0",
      "org.pac4j" % "pac4j" % "1.8.7",
      "org.pac4j" % "pac4j-http" % "1.8.7",
      "org.pac4j" % "pac4j-cas" % "1.8.7",
      "org.pac4j" % "pac4j-openid" % "1.8.7",
      "org.pac4j" % "pac4j-oauth" % "1.8.7",
      "org.pac4j" % "pac4j-saml" % "1.8.7",
      "org.pac4j" % "pac4j-oidc" % "1.8.7",
      "org.pac4j" % "pac4j-gae" % "1.8.7",
      "org.pac4j" % "pac4j-jwt" % "1.8.7",
      "org.pac4j" % "pac4j-ldap" % "1.8.7",
      "org.pac4j" % "pac4j-sql" % "1.8.7",
      "org.pac4j" % "pac4j-mongo" % "1.8.7",
      "org.pac4j" % "pac4j-stormpath" % "1.8.7")

我的SecurityModule类:

public class SecurityModule extends AbstractModule {
protected void configure() {
    FacebookClient facebookClient = new FacebookClient("KEY", "SECRET_KEY");
    Clients clients = new Clients("http://localhost:9000/callback",facebookClient);
    Config config = new Config(clients);
    config.addAuthorizer("admin",new RequireAnyRoleAuthorizer("ROLE_ADMIN"));
    bind(Config.class).toInstance(config);

}

}

我的项目中提供了play.libs.F包。 Eclipse screenshot

我基本上试着想到的一切。现在我只想在路由配置文件中为我的一个地址启用简单的身份验证。 我按照这里发布的说明进行了跟踪:https://github.com/pac4j/play-pac4j。 任何帮助和提示将不胜感激。

1 个答案:

答案 0 :(得分:2)

查看问题页面here,pac4j与Play 2.5不兼容。听起来像pac4j正在使用的2.5中缺少一些API。你在堆栈交易中看到的是Play 2.5删除scala f.Functionf.Function0类等,而不是Java8 java.util.function.*类型。那个here上有doco。

简而言之,要么等待pac4j 2.3.0出来,要么回到Play 2.4。