scala - 播放 2.6 剪影组成 SecuredAction
问题描述
我正在尝试做一些与此非常相似的事情。ContextRequest
和ContextAction
。我有一个securedRequest
来自Silhouette
,我想撰写一个我设置的Action
阅读。cookie
不同的是我扩展了User
from SilhouetteIdentity
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
}
推荐阅读
- python - keras中的输入形状RNN
- azure-cosmosdb - Cosmos SDK 3.0 中的 FeedOptions.PopulateQueryMetrics
- c++ - 为什么函数中b的第一个打印语句打印的是5而不是6?
- blazor-server-side - Blazor EditForm 缺少电子邮件和电话?
- azure - 微软 Azure SQL 数据同步
- php - 在 ARM CPU 上升级 PHP
- python - 为什么我在 response_moedel 中不使用 List 时会抛出错误?
- javascript - 如何在水平堆积条形图中显示条形值
- amazon-web-services - SCP 不会找到文件,即使它存在
- python - SQLAlchemy - 使用旧对象的新会话时对象“已存在于此会话中”