如何在SecureSocial中禁用提供程序?

5
我正在使用 Play Framework 2.3.2 和 Activator 1.2.3,并尝试使用 SecureSocial 插件 master-SNAPSHOT 进行实验。 文档 中写道:
SecureSocial 的设计采用了插件化的模块化架构。这意味着您可以轻松地启用/禁用它们,以仅包含所需内容,并且如果需要自定义工作方式,则可以更改内置插件为您自己的实现。
插件在 conf 目录下的 play.plugins 文件中定义。如果您还没有该文件,请创建一个并添加以下内容:
[示例插件列表] 只有在 play.plugins 文件中包含的身份验证提供程序才会出现在登录页面上。

我现在正在尝试SecureSocial存储库中包含的Java演示。 play.plugins文件仅包含一行:

1500:com.typesafe.plugin.CommonsMailerPlugin

但是,如果我运行演示文稿,所有提供商都可用: Running demo screenshot

我如何关闭某些提供商?根据文档,我期望注释掉play.plugins中的一些行,但是没有需要注释掉的行。
这里发生了什么?
2个回答

7
如果插件文件中未配置提供程序,则必须使用master-SNAPSHOT而不是2.1.3,因为后者不再使用Play插件。现在有一个RuntimeEnvironment,在其中配置模块可用的服务(包括您需要实现的UserService)。
默认环境包括所有提供程序,并且演示使用的就是这个环境:https://github.com/jaliss/securesocial/blob/master/samples/java/demo/app/service/MyEnvironment.scala 在master中有很多更改,但文档尚未更新。要自定义可用的提供程序,您需要创建自己的环境类,该类扩展RuntimeEnvironment.Default并覆盖providers字段。例如:
class MyEnvironment extends RuntimeEnvironment.Default[DemoUser] {
    override val userService: UserService[DemoUser] = new MyUserService()
    override lazy val providers = ListMap(
         include(
            new FacebookProvider(routes, cacheService,oauth2ClientFor(FacebookProvider.Facebook))
         ),
         include(
            new FoursquareProvider(routes,cacheService,oauth2ClientFor(FoursquareProvider.Foursquare))
         ),
         include(
            new UsernamePasswordProvider[DemoUser](userService, avatarService, viewTemplates, passwordHashers)
         )
    )
}

这里的MyUserService是你的UserService实现,而DemoUser是你想用来表示用户动作的类。


嘿,谢谢你提供的信息。是的,实际上是master-SNAPSHOT(在使用Play时,由于所有不兼容版本的东西让我疯了,所以这个细节我忽略了)。在MyEnvironment中,我重写了providers,只留下了我想要的部分,现在它可以正常工作了!如果你更新你的答案并详细说明步骤,我会接受它的。 - vektor
有没有Java的等效物?我是Scala的新手,正在努力让它在Java中工作。 - ss_everywhere
环境需要用Scala编写。请查看存储库中的Java示例演示如何使用。请参见https://github.com/jaliss/securesocial/blob/master/samples/java/demo/app/Global.java#L23和https://github.com/jaliss/securesocial/blob/master/samples/java/demo/app/service/MyEnvironment.scala。 - Jorge

0

我正在使用JAVA实现我的解决方案。我想做同样的事情。以下是我这个解决方案的最终代码。我创建了一个名为“filter”的函数并重写了“providers()”方法。

  public class SocialSecureRuntimeEnvironment extends RuntimeEnvironment.Default<Nuser> {
  private BaseUserService<Nuser> userService = new NuserService();
  private ListMap<String, IdentityProvider> providers = null;

  @Override
  public BaseUserService<Nuser> userService() {
    return userService;
  }

  @Override
  public ListMap<String, IdentityProvider> providers() {
    if (providers != null) {
      return providers;
    }
    providers = filter(super.providers(), "userpass");
    return providers;
  }

  @SuppressWarnings("unchecked")
  private ListMap<String, IdentityProvider> filter(ListMap<String, IdentityProvider> current,
      String provider) {
    while (current.size() > 0 && !current.key().equals(provider)) {
      current = current.next();
    }

    if (current.size() > 1) {
      current = (ListMap<String, IdentityProvider>) current.drop(current.size() - 1);
    }
    return current;
  }
}

接下来是我的登录界面在此之后的样子。

enter image description here


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