【发布时间】:2019-05-05 23:00:56
【问题描述】:
我正在尝试做一些与this 非常相似的事情。 ContextRequest 和 ContextAction。我有一个来自Silhouette 的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中traitIdentity的子类,但方法参数类型必须完全匹配。)
我知道我可能缺少包装器。
【问题讨论】:
标签: scala playframework silhouette