Как реализовать несколько аутентификаторов Silhouette JWT в одном приложении? - PullRequest
0 голосов
/ 27 февраля 2019

Существуют примеры использования нескольких типов аутентификаторов в одном приложении Play Framework. НО тот, который мне нужен, - это использование 2 аутентификаторов JWT, где они имеют разные headerNames, утверждения эмитента и crypter, используя отдельные среды Silhouette.для каждого внутри одного и того же приложения.

Обновление: я создал 2 среды для Silhouette, но обе подписи одинаковы только с разными именами, как показано ниже:

trait DefaultEnv extends Env {
  type I = User
  type A = JWTAuthenticator
}

trait CustomEnv extends Env {
  type I = User
  type A = JWTAuthenticator
}

MyModule extends AbstractModule with ScalaModule {
  ...
@Provides
  def provideAuthenticatorService(crypter: Crypter,
                                  idGenerator: IDGenerator,
                                  configuration: Configuration,
                                  clock: Clock): AuthenticatorService[JWTAuthenticator] = {

    val encoder = new CrypterAuthenticatorEncoder(crypter)

    new JWTAuthenticatorService(JWTAuthenticatorSettings(
      fieldName = configuration.underlying.getString("silhouette.authenticator.headerName"),
      issuerClaim = configuration.underlying.getString("silhouette.authenticator.issuerClaim"),
      authenticatorExpiry = FiniteDuration(configuration.underlying.getLong("silhouette.authenticator.authenticatorExpiry"), "seconds"),
      sharedSecret = configuration.underlying.getString("application.secret")

    ), None, encoder, idGenerator, clock)
  }
}

Это фактически обеспечивает то же самое AuthenticatorService, как предоставить разные AuthenticatorService для разных именованных сред, в то время как они на самом деле AuthenticatorService[JWTAuthenticator]?

1 Ответ

0 голосов
/ 28 февраля 2019

Наконец-то удалось работать, чтобы разрешить 2 JWTA-аутентификатора в одном приложении-силуэте воспроизведения: AuthenticatorService[JWTAuthenticator] и еще одно

CustomAuthenticatorService[CustomJWTAuthenticator]

с Environment и CustomEnvironment, существующие вместе

с Silhouette[DefaultEnv] и CustomSilhouette[CustomEnv]

, где

trait DefaultEnv extends Env {
  type I = User
  type A = JWTAuthenticator
}

trait CustomEnv extends Env {
  type I = User
  type A = CustomJWTAuthenticator
}

Требовалось разрешить 2 разных набора apis для 2 разных клиентов одного и того же внутреннего сервиса, где токены jwt для одного набора apis могутне может использоваться для аутентификации другого набора API, даже внутри того же контроллера.Это решение было реализовано таким образом, чтобы не допустить взлома моделей или кодовой базы для 2 разных клиентов, когда они используют одну и ту же базу данных и шину событий.

...