簡體   English   中英

Play 2.6 Silhouette compose SecuredAction

[英]Play 2.6 Silhouette compose SecuredAction

我正在嘗試做一些與非常相似的事情。 ContextRequestContextAction 我有一個來自SilhouettesecuredRequest ,我想securedRequest一個Action讀取我設置的cookie

不同的是我從Silhouette Identity擴展了User

DataSourceRequest

class DataSourceRequest[DefaultEnv, B](
  val dataSource: Option[String],
  val securedRequest: SecuredRequest[DefaultEnv, B]
) extends WrappedRequest[B](securedRequest.request) {
  def user: User = securedRequest.identity
  def requestV: Request[B] = securedRequest.request
}

DataSourceAction

class DataSourceAction @Inject()
  (val parser: BodyParsers.Default)(implicit val executionContext: ExecutionContext)
  extends ActionRefiner[({ type R[B] = SecuredRequest[DefaultEnv, B] })#R, ({ type R[B] = DataSourceRequest[DefaultEnv, B] })#R] {

  override protected def refine[A](securedRequest: SecuredRequest[DefaultEnv, A]) = Future.successful {
    try {
      Right(new DataSourceRequest[DefaultEnv, A](
        securedRequest.session.get("dataSource").getOrElse("dataSourceMissing"),
        securedRequest
      ))
    } catch {
      case _: Exception => Left(Results.NotFound)
    }
  }
}

DefaultEnv

trait DefaultEnv extends Env {
  type I = User
  type A = CookieAuthenticator
}

我無法獲得User因為

(注意com.mohiva.play.silhouette.api.Identity不匹配models.User:包實體中的類User是包api中trait Identity的子類,但方法參數類型必須完全匹配。)

我知道我可能缺少一個包裝器。

嘗試將上下文綁定到您的Env ,如下所示:

class DataSourceRequest[Env <: DefaultEnv, B](
  val dataSource: Option[String],
  val securedRequest: SecuredRequest[Env, B]
) extends WrappedRequest[B](securedRequest.request) {
  def user: User = securedRequest.identity
  def requestV: Request[B] = securedRequest.request
}

我在拉取請求中添加了一些功能,這些功能應該做同樣的事情https://github.com/mohiva/play-silhouette-seed/pull/118

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM