如何在scala中用oauth2实现通用的slick dao

如何在scala中用oauth2实现通用的slick dao,scala,oauth-2.0,akka-http,slick-3.0,Scala,Oauth 2.0,Akka Http,Slick 3.0,为了在scala中使用OAuth2、Slick、Akka HTTP,我使用了来自CDnizing的代码 我尝试创建一个DAO:UserDao和相应的API:UserApi,以便在成功验证OAuth2之后从数据库中获取所有记录(JSON格式) BaseDao代码: trait BaseDao[T,A] { ... def getAll(): Future[Seq[A]] } class BaseDaoImpl[T <: BaseTable[A], A <: BaseEntit

为了在scala中使用OAuth2、Slick、Akka HTTP,我使用了来自CDnizing的代码

我尝试创建一个DAO:UserDao和相应的API:UserApi,以便在成功验证OAuth2之后从数据库中获取所有记录(JSON格式)

BaseDao代码:

trait BaseDao[T,A] {
  ...
  def getAll(): Future[Seq[A]]
}

class BaseDaoImpl[T <: BaseTable[A], A <: BaseEntity]()(implicit val tableQ: TableQuery[T], implicit val db: JdbcProfile#Backend#Database,implicit val profile: JdbcProfile) extends BaseDao[T,A] with Profile with DbModule {

  import profile.api._

  ...
  override def getAll(): Future[Seq[A]] = {
    db.run(tableQ.result)
  }

}
用户API代码:

//using io.circe for json encoder
class UserApi(val modules: Configuration with PersistenceService, val db: DatabaseService)(implicit executionContext: ExecutionContext) extends BaseApi {
  override val oauth2DataHandler = modules.oauth2DataHandler

  val userService = new UserDao
  val testApi = pathPrefix("auth") {
    path("users") {
      pathEndOrSingleSlash {
        get {
          authenticateOAuth2Async[AuthInfo[OauthAccount]]("realm", oauth2Authenticator) {
            auth => complete(userService.getAll().map(_.asJson))
          }

        }
      }
    }
  }
}
支持代码:

trait Profile {
  val profile: JdbcProfile
}


trait DbModule extends Profile{
  val db: JdbcProfile#Backend#Database
}

trait PersistenceService {
  val accountsDao: AccountsDao
  val oAuthAuthorizationCodesDao: OAuthAuthorizationCodesDao
  val oauthClientsDao: OAuthClientsDao
  val oauthAccessTokensDao:  OAuthAccessTokensDao
  val oauth2DataHandler : DataHandler[OauthAccount]
}


trait PersistenceServiceImpl extends PersistenceService with DbModule{
  this: Configuration  =>

  private val dbConfig : DatabaseConfig[JdbcProfile]  = DatabaseConfig.forConfig[JdbcProfile]("mysqldb")

  override implicit val profile: JdbcProfile = dbConfig.driver
  override implicit val db: JdbcProfile#Backend#Database = dbConfig.db


  override val accountsDao = new AccountsDaoImpl
  override val oAuthAuthorizationCodesDao = new OAuthAuthorizationCodesDaoImpl
  override val oauthClientsDao = new OAuthClientsDaoImpl(this)
  override val oauthAccessTokensDao = new  OAuthAccessTokensDaoImpl(this)
  override val oauth2DataHandler = new OAuth2DataHandler(this)
}
在这里,代码运行时没有任何问题,但是没有得到任何记录作为响应,尽管有记录


这段代码中有什么我无法探究的问题?任何建议都是可以接受的。

您是说这部分:
db.run(tableQ.result)
不返回任何结果吗?是的。某种程度上。但我猜不出这里有什么问题
trait Profile {
  val profile: JdbcProfile
}


trait DbModule extends Profile{
  val db: JdbcProfile#Backend#Database
}

trait PersistenceService {
  val accountsDao: AccountsDao
  val oAuthAuthorizationCodesDao: OAuthAuthorizationCodesDao
  val oauthClientsDao: OAuthClientsDao
  val oauthAccessTokensDao:  OAuthAccessTokensDao
  val oauth2DataHandler : DataHandler[OauthAccount]
}


trait PersistenceServiceImpl extends PersistenceService with DbModule{
  this: Configuration  =>

  private val dbConfig : DatabaseConfig[JdbcProfile]  = DatabaseConfig.forConfig[JdbcProfile]("mysqldb")

  override implicit val profile: JdbcProfile = dbConfig.driver
  override implicit val db: JdbcProfile#Backend#Database = dbConfig.db


  override val accountsDao = new AccountsDaoImpl
  override val oAuthAuthorizationCodesDao = new OAuthAuthorizationCodesDaoImpl
  override val oauthClientsDao = new OAuthClientsDaoImpl(this)
  override val oauthAccessTokensDao = new  OAuthAccessTokensDaoImpl(this)
  override val oauth2DataHandler = new OAuth2DataHandler(this)
}