【问题标题】:How to disable a provider in SecureSocial?如何在 SecureSocial 中禁用提供程序?
【发布时间】:2014-08-03 12:31:24
【问题描述】:

我正在使用 Play Framework 2.3.2 和 Activator 1.2.3,并且正在尝试使用 SecureSocial 插件 master-SNAPSHOT。

Documentation 说如下:

SecureSocial 采用插件的模块化架构设计。这 意味着您可以轻松启用/禁用它们以仅包含您需要的内容 并且您可以更改自己的内置插件 如果需要自定义事情的工作方式,则实施。

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

[插件示例列表]

只有您包含在 play.plugins 文件中的身份验证提供程序才会出现在登录中 页面。

(已添加重点。)

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

1500:com.typesafe.plugin.CommonsMailerPlugin

但如果我运行演示,所有提供程序都可用:

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

这是怎么回事?

【问题讨论】:

    标签: playframework securesocial typesafe-activator


    【解决方案1】:

    如果未在插件文件中配置提供程序,您必须使用 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 的环境类并覆盖提供程序字段。例如:

    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,只留下了我想要的那些并且它有效!如果您更新您的答案以阐明程序,我将接受它。
    • 是否有对应的 Java 版本?我是 Scala 的新手,正在努力让它在 java 中工作。
    • 环境需要用Scala编写。签出存储库中的示例 Java 演示以了解它是如何使用的。见github.com/jaliss/securesocial/blob/master/samples/java/demo/…github.com/jaliss/securesocial/blob/master/samples/java/demo/…
    【解决方案2】:

    我正在用 JAVA 实现我的解决方案。我想做同样的事情。以下是我对此解决方案的最终代码。我创建了一个“过滤器”函数并覆盖了 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;
      }
    }
    

    以下是我的登录屏幕在此之后的样子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-28
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 2020-08-14
      • 2010-12-03
      相关资源
      最近更新 更多