我正在使用play-pac4j库(不是 java 而是 scala 语言版本)在我的 play 框架应用程序中实现 OAuth2 身份验证。
我想添加我自己的逻辑,在 OAuth 提供者的回调过程中通过 slick 访问数据库。但是我不知道如何正确实施它。
我尝试了以下方法,但放弃了。
- 在生成时创建和设置
CustomCallbackLogic
类CallbackController
configure()
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.enabled
到application.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 ,但是这样我需要自己实例化,不知道怎么做。
如何将数据库访问处理添加到回调逻辑?