如何在同一应用程序中实现多个Silhouette JWT Authenticator?

时间:2019-02-27 03:34:17

标签: scala authentication playframework jwt silhouette

有些示例在同一个Play Framework应用程序中使用多种类型的身份验证器,但我所追求的是使用2个JWT身份验证器,它们具有不同的标头名称,颁发者声明和使用单独的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,如何在它们实际上都是AuthenticatorService时为不同的命名环境提供不同的AuthenticatorService[JWTAuthenticator]

1 个答案:

答案 0 :(得分:0)

最终设法在单个播放轮廓应用程序中允许2个JWTAuthenticator: AuthenticatorService[JWTAuthenticator]和另一个

CustomAuthenticatorService[CustomJWTAuthenticator]

EnvironmentCustomEnvironment并存

带有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。此解决方案的实现方式是为了防止两个不同的客户端在使用相同的数据库和事件总线时破坏模型或代码库。