【问题标题】:Interface play.api.Plugin is not assignable from class services.InMemoryUserService接口 play.api.Plugin 不能从类 services.InMemoryUserService 分配
【发布时间】:2016-03-05 11:56:35
【问题描述】:

我正在尝试使用play 2.4.4(与2.4.2 相同)和SecureSocial 实现OAUTH2 身份验证,我的Scala 版本是2.11.7

我正在关注SecureSocial 的教程以及SecureSocial demo 的 Githhub 示例

我从文件play.plugins 中没有任何内容开始,然后尝试使用以下之一登录

http://localhost:9000/api/custom/login

我最终得到以下错误:

[RuntimeException: [securesocial] Missing properties for provider 'facebook'. Verify your configuration file is properly set.]

好的,2 个问题,1 没有登录,2 即使有登录我对 facebook 不感兴趣,只有 google。

在 SecureSocial 网站上配置后,有一个文件 play.plugin,您需要在其中指定您想要的提供者和处理身份验证的用户服务(用户服务可以在 github 示例中找到)

我的 play.plugins 看起来像这样:

9998:services.InMemoryUserService
10002:securesocial.core.providers.GoogleProvider

现在当我再次尝试相同的 URL 时,我收到以下错误:

java.lang.ClassCastException: interface play.api.Plugin is not assignable from class services.InMemoryUserService
 play.utils.Reflect$.getClass(Reflect.scala:145)
 play.api.Plugins$$anonfun$loadPlugins$1.apply(Plugins.scala:88)
 play.api.Plugins$$anonfun$loadPlugins$1.apply(Plugins.scala:87)
 scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245)
 scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:245)
 scala.collection.immutable.List.foreach(List.scala:381)
 scala.collection.TraversableLike$class.map(TraversableLike.scala:245)
 scala.collection.immutable.List.map(List.scala:285)
 play.api.Plugins$.loadPlugins(Plugins.scala:87)
 play.api.Plugins$$anonfun$apply$4.apply(Plugins.scala:100)
 ...

什么!?

好的,现在我尝试使用其他身份验证网址:

http://localhost:9000/auth/authenticate/google

我得到同样的错误,如果我远程 play.plugins 我得到一个 Guice 异常,我不知道如何修复。

谢谢

【问题讨论】:

    标签: scala playframework-2.0 guice securesocial


    【解决方案1】:

    在线文档适用于旧版本(尚未更新)。

    模块中不再使用插件。您现在拥有的是一个 RuntimeEnvironment 类,您可以使用它来配置您想要使用的服务。有一个 RuntimeEnvironment.Default 类,您也可以将其用作基础,这就是演示在这里使用的:https://github.com/jaliss/securesocial/blob/3.0-M4/samples/scala/demo/app/Global.scala#L27

    在您的情况下,您将只包括 Google 提供程序,因此基本上将提供程序覆盖为:

    override lazy val providers = ListMap(
         include(
            new GoogleProvider(routes,cacheService,oauth2ClientFor(GoogleProvider.Google)))
         )
    

    您需要在 Google 控制台中创建应用才能获取您的 oauth 密钥。您需要在 securesocial.conf 中设置这些密钥(查找 google 部分)。请务必确保在 Google 控制台中为您的应用启用 Google+ API,否则由于缺少权限而无法登录。

    定义好环境后,您需要创建一个模块来绑定它。示例在这里执行此操作:https://github.com/jaliss/securesocial/blob/3.0-M4/samples/scala/demo/app/DemoModule.scala#L6

    最后你告诉 Play 在 application.conf 中使用你的模块:https://github.com/jaliss/securesocial/blob/3.0-M4/samples/scala/demo/conf/application.conf#L13

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 2021-08-13
      • 2021-04-24
      相关资源
      最近更新 更多