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

问题描述 投票:0回答:1

在同一个Play Framework应用程序中有一些使用多种类型的Authenticator的例子,但我所使用的是,使用2个JWT身份验证器,它们具有不同的headerNames,issuer声明和crypter,在同一个应用程序中使用单独的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]

scala authentication playframework jwt silhouette
1个回答
0
投票

最后设法在单个游戏剪影应用程序中允许2个JWTAuthenticators: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。此解决方案以这种方式实现,以防止在使用相同数据库和事件总线时破坏2个不同客户端的模型或代码库。

© www.soinside.com 2019 - 2024. All rights reserved.