0

有在同一个 Play Framework 应用程序中使用多种类型的身份验证器的示例,我之后的一个是使用 2 个 JWT 身份验证器,它们具有不同的 headerNames、颁发者声明和加密器,在同一应用程序中为每个应用程序使用单独的 Silhouette 环境。

更新:我为 Silhouette 创建了 2 个环境,但两个签名都相同,只是名称不同,如下所示:

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如何为不同的命名环境提供不同的?AuthenticatorServiceAuthenticatorService[JWTAuthenticator]

4

1 回答 1

0

终于设法在单个播放剪影应用程序中允许 2 个 JWTAuthenticator: 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 组不同的 api 用于同一后端服务的 2 个不同客户端,其中一组 api 的 jwt 令牌即使在同一控制器内也不能用于验证另一组 api。此解决方案以这种方式实现,以防止在 2 个不同的客户端使用相同的数据库和事件总线时破坏模型或代码库。

于 2019-02-28T08:46:30.650 回答