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

Playframework 如何在SecureSocial中禁用提供程序?,playframework,securesocial,typesafe-activator,Playframework,Securesocial,Typesafe Activator,我正在使用2.3.2和1.2.3,并且正在试验插件主快照 他说: SecureSocial采用模块化架构设计,使用插件。这 意味着您可以轻松地启用/禁用它们以仅包含您需要的内容 而且你也可以为自己更改内置插件 如果需要自定义事物的工作方式,请执行 插件在conf目录下的play.Plugins文件中定义。 如果您还没有该文件,请创建一个并添加: [插件示例列表] 只有包含在play.plugins文件中的身份验证提供程序才会显示在登录名上 第页。 (重点加上。) 我现在正在试用SecureSoc

我正在使用2.3.2和1.2.3,并且正在试验插件主快照

他说:

SecureSocial采用模块化架构设计,使用插件。这 意味着您可以轻松地启用/禁用它们以仅包含您需要的内容 而且你也可以为自己更改内置插件 如果需要自定义事物的工作方式,请执行

插件在conf目录下的play.Plugins文件中定义。 如果您还没有该文件,请创建一个并添加:

[插件示例列表]

只有包含在play.plugins文件中的身份验证提供程序才会显示在登录名上 第页。

(重点加上。)

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

1500:com.typesafe.plugin.CommonsMailerPlugin
但是,如果我运行演示,所有提供程序都可用:

如何关闭某些提供商?根据文档,我希望注释掉
play.plugins
中的一些行,但没有注释掉的行


这是怎么回事?

如果插件文件中未配置提供程序,则必须使用master SNAPSHOT,而不是2.1.3,后者不再使用Play插件。现在有了一个运行时环境,您可以在其中配置模块可用的服务(包括需要实现的UserService)

默认环境包括所有提供程序,演示使用:

master中有很多更改,文档尚未更新。要自定义可用的提供程序,您需要创建自己的环境类扩展RuntimeEnvironment.Default并覆盖提供程序字段。例如:

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
是您希望用于在操作中表示用户的类。

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

公共类SocialSecurerRuntimeEnvironment扩展RuntimeEnvironment.Default{
private BaseUserService userService=new NuserService();
私有ListMap提供者=null;
@凌驾
公共BaseUserService用户服务(){
返回用户服务;
}
@凌驾
公共列表映射提供程序(){
如果(提供程序!=null){
退货供应商;
}
提供者=过滤器(super.providers(),“userpass”);
退货供应商;
}
@抑制警告(“未选中”)
专用ListMap筛选器(当前ListMap,
字符串提供程序){
while(current.size()>0&&!current.key().equals(提供程序)){
当前=当前。下一步();
}
如果(当前.size()>1){
current=(ListMap)current.drop(current.size()-1);
}
回流;
}
}
下面是我的登录屏幕在这之后的样子


嘿,谢谢你提供的信息。是的,它实际上是主快照(当使用Play时,我对所有不兼容版本的东西都很疯狂,所以这让我滑倒了)。在
MyEnvironment
中,我覆盖了
提供者
,只留下了我想要的,而且它可以工作!如果你更新你的答案来详细说明这个过程,我会接受的。有没有Java的等价物?我是Scala新手,正在努力用java实现这一点。环境需要用Scala编写。在存储库中签出示例Java演示,查看它是如何使用的。看到和
  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;
  }
}