Как отключить провайдера в SecureSocial?

Я использую Play Framework 2.3.2 с Activator 1.2.3, и я экспериментирую с плагином SecureSocial master-SNAPSHOT.

В документации говорится следующее:

SecureSocial имеет модульную архитектуру с использованием плагинов. Это означает, что вы можете легко включить/отключить их, чтобы включить только то, что вам нужно, а также то, что вы можете изменить встроенные плагины для своей собственной реализации, если есть необходимость настроить работу.

Плагины определяются в файле play.plugins в каталоге conf. Если у вас еще нет этого файла, создайте его и добавьте:

[пример списка плагинов]

На странице входа будут отображаться только поставщики аутентификации, указанные вами в файле play.plugins.

(Выделение добавлено.)

Сейчас я пробую демонстрацию Java, включенную в репозиторий SecureSocial. Файл play.plugins содержит только одну строку:

1500:com.typesafe.plugin.CommonsMailerPlugin

Но если я запускаю демо, все провайдеры доступны: Скриншот запущенной демо

Как отключить некоторых провайдеров? Основываясь на документации, я ожидаю закомментировать некоторые строки в play.plugins, но закомментировать нечего.

Что здесь происходит?


person vektor    schedule 03.08.2014    source источник


Ответы (2)


Если провайдеры не настроены в файле плагинов, вы должны использовать master-SNAPSHOT вместо 2.1.3, который больше не использует плагины Play. Вместо этого теперь есть RuntimeEnvironment, где вы настраиваете службы, доступные для модуля (включая UserService, который вам необходимо реализовать).

Среда по умолчанию включает всех провайдеров и используется в демо: https://github.com/jaliss/securesocial/blob/master/samples/java/demo/app/service/MyEnvironment.scala

В мастере много изменений, а документы еще не обновлены. Чтобы настроить доступных провайдеров, вам нужно создать собственный класс среды, расширяющий 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 — это класс, который вы хотите использовать для представления пользователей в своих действиях.

person Jorge    schedule 06.08.2014
comment
Эй, спасибо за информацию. Да, это вообще-то master-SNAPSHOT (я без ума от всех несовместимых версий всякой всячины при работе с Play, так что это у меня проскочило). В MyEnvironment перепрошил providers, оставил только те что хочу и работает! Если вы обновите свой ответ, чтобы разъяснить процедуру, я приму ее. - person vektor; 07.08.2014
comment
Есть ли эквивалент Java для этого? Я новичок в Scala и изо всех сил пытаюсь заставить это работать в java. - person Sudarshan Shubakar; 15.12.2014
comment
Среда должна быть написана на Scala. Ознакомьтесь с демонстрационным примером Java в репозитории, чтобы узнать, как он используется. См. github.com/jaliss/securesocial /blob/master/samples/java/demo/ и github.com/jaliss/securesocial/blob/master/samples/java/demo/ - person Jorge; 15.12.2014

Ну, я реализую свое решение в JAVA. И я хотел сделать то же самое. Ниже приведен мой окончательный код для этого решения. Я сделал функцию «фильтр» и переопределил метод provider().

  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;
  }
}

Ниже показано, как выглядит мой экран входа в систему после этого.

введите здесь описание изображения

person Muhammad Haris Altaf    schedule 03.04.2015