scala - 整个控制器的身份验证
问题描述
我有一个需要身份验证的控制器和不需要身份验证的控制器的项目。
我已经在此处实现了有关操作组合的文档,因此我将我UserAction
的注入到每个需要身份验证的控制器中
class UserRequest[A](val user: Option[String], request: Request[A]) extends WrappedRequest[A](request)
class UserAction @Inject()(val parser: BodyParsers.Default)(implicit val executionContext: ExecutionContext)
extends ActionBuilder[UserRequest, AnyContent] with ActionTransformer[Request, UserRequest] {
def transform[A](request: Request[A]) = Future.successful {
if(request.queryString.contains("token")){
val token = request.queryString("token").head
new UserRequest(Some(token), request)
} else {
new UserRequest(None, request)
}
}
def PermissionCheckAction(implicit ec: ExecutionContext) = new ActionFilter[UserRequest] {
def executionContext = ec
def filter[A](input: UserRequest[A]) = Future.successful {
if (input.user.isEmpty)
Some(Results.Unauthorized)
else
None
}
}
}
和 hte 控制器:
class ResultsController @Inject()(
adRepo: AdRepository,
userAction : UserAction
) extends InjectedController {
如何重构父控制器中的注入,并将用户操作应用于控制器中的所有操作?
解决方案
您必须将自定义操作应用于每个控制器端点。在您的情况下,将自定义操作应用于控制器中需要身份验证的每个功能。
在文档中再往下一点,您会发现如何:
def tagItem(itemId: String, tag: String)(implicit ec: ExecutionContext) =
(userAction andThen ItemAction(itemId) andThen PermissionCheckAction) { request =>
request.item.addTag(tag)
Ok("User " + request.username + " tagged " + request.item.id)
}
现在request
是 aUserRequest
并且已经检查了权限。
编辑
由于您没有ItemAction
,只需将该行重写为:
(userAction andThen PermissionCheckAction)
推荐阅读
- javascript - 如何使用 JavaScript 或 JQuery 连接 iframe 源的链接和输入?
- html - 如何在 Web 的 React Js 组件中使用 api?
- python - 如何在“for循环”之后将我的结果(输出)放入二维列表或嵌套列表中?
- flutter - 无法从函数“fetchPromotions”返回类型为“Resut”的值,因为它的返回类型为 Future
- >
- linux - 如何安装MSYS2的十字路口?
- visual-studio - 如何将 Visual Studio 键绑定导入 VSCode?
- angular - 为什么注入不适用于抽象?
- vb.net - Visual Studio 2019,如何在我的软件安装中包含 Access 数据库引擎?
- python - 如何从 DatetimeIndex 获取 Isoweek
- python - 为什么在 google colab 中出现名称错误?