0

我正在使用play-pac4j库(不是 java 而是 scala 语言版本)在我的 play 框架应用程序中实现 OAuth2 身份验证。

我想添加我自己的逻辑,在 OAuth 提供者的回调过程中通过 slick 访问数据库。但是我不知道如何正确实施它。

我尝试了以下方法,但放弃了。

  • 在生成时创建和设置CustomCallbackLogicCallbackControllerconfigure()SecurityModule.scala
  • 扩展并CustomCallbackLogic覆盖DefaultCallbackLogic一些必要的方法
  • 在 override 方法中访问数据库

我放弃的原因是因为我在创建 CallbackLogic 实例时不知道如何进行 DI。

源代码如下。

环境

  • 播放框架2.8.8
  • 斯卡拉 2.13.6
  • 播放-pac4j 11.0.0-PLAY2.8
  • 玩滑 5.0.0

CustomCallbackLogic.scala

需要输入查询实现类和数据库访问配置和ExecutionContext作为线程池。

class CustomCallbackLogic @Inject() (
  protected val dbConfigProvider: DatabaseConfigProvider,
  userFindQuery: UserFindQuery
)(implicit ec: ExecutionContext)
extends DefaultCallbackLogic {

  override def saveUserProfile(...): Unit = {
    // database access logic via slick
    val email = profile.getAttributes...
    userFindQuery.run(email)...
  }
}

用户查找查询

trait UserFindQuery {
  def run(email: String): Future[Option[User]]
}

UserFindQueryImpl

class UserFindQueryImpl @Inject() (
  protected val dbConfigProvider: DatabaseConfigProvider)
  (implicit val ec: ExecutionContext)
extends HasDatabaseConfigProvider[PostgresProfile] {

  override def run(email: String): Future[Option[UserView]] = {
    val action = Users
      .filter(_.email === email)
      ...
    db.run(action)
  }
}

SecuritiModule.scala

这是一个用于 pac4j 设置的模块。confiture()根据文档设置回调相关类。该模块被添加play.modules.enabledapplication.conf.

class SecurityModule(environment: Environment, configuration: Configuration)
extends AbstractModule {
  override def configure(): Unit = {

    bind(classOf[SessionStore]).to(classOf[PlayCacheSessionStore])
    bind(classOf[SecurityComponents]).to(classOf[DefaultSecurityComponents])

    // callback
    val callbackController = new CallbackController()
    val customCallbackLogic = new customCallbackLogic() // how can I DI here
    callbackController.setDefaultUrl("/")
    callbackController.setCallbackLogic(customCallbackLogic)
    bind(classOf[CallbackController]).toInstance(callbackController)

    // logout
    ...
  }
  ...
}

如果是controller类下的scala类,Guice会像这样自动实例化和DI ,但是这样我需要自己实例化,不知道怎么做。

如何将数据库访问处理添加到回调逻辑?

4

0 回答 0