播放2.6添加/读取请求属性

时间:2018-02-11 14:39:54

标签: scala playframework request playframework-2.6

我正在尝试为我的API实现身份验证。我创建了一个过滤器,它将根据令牌加载当前用户。

用户的加载工作(从示例中删除),但现在我想将用户添加到请求属性,以便我可以在操作或控制器中访问它。但我无法让它发挥作用:

package filters

import java.util.UUID
import javax.inject.Inject

import akka.stream.Materializer
import play.api.libs.typedmap.TypedKey
import play.api.mvc.{Filter, RequestHeader, Result}
import service.UserService

import scala.concurrent.{ExecutionContext, Future}

class LoadUserFilter @Inject() (implicit val mat: Materializer, ec: ExecutionContext) extends Filter {

  override def apply(nextFilter: RequestHeader => Future[Result]) (requestHeader: RequestHeader): Future[Result] = {
    val newRequest = requestHeader.addAttr(TypedKey.apply[String]("user"), "test")
    System.out.println(newRequest.attrs(TypedKey.apply[String]("user"))) // attribute not found....
    nextFilter(newRequest)
  }
}

这是我得到的例外:

Caused by: java.util.NoSuchElementException: key not found: user

由于某种原因,该属性未添加...我正在使用更新的请求但它仍然无效。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

如果我正确理解了这个问题,您需要从请求标头中提取用户ID。我不确定Filter是否适合这个目的。这可以通过不同的方式完成,我为此选择了ActionBuilder和ActionTransformers。请参阅Play Framework网站上的Action Composition

首先你需要一个RedirectingAction。然后我通过TokenExtractAction提取令牌,通过UserIdExtractAction提取用户ID,并在PermissionCheckAction中检查auth。

这种方式它是可组合的,高性能的和可重用的。在您的控制器中,使用SecureAction而不是Action。然后你免费获得所有奖金userId,令牌等。如果auth失败,它会无声地失败并且不会使控制器混乱。这是基于我记得在Play网站上看到的例子。但我不得不扩展它。在那里提供的替代方案中,我发现这个对于验证每个REST请求情况最有用。

我也使用actor系统进行身份验证。你可以轻松地为自己建立一个。

def someSecureMethod = secureActionProvider.SecureAction.async ... {
   ...
}  

在您的控制器中:

{{1}}

希望这有帮助。

答案 1 :(得分:0)

做这样的事情怎么样:

nextFilter(requestHeader).map { result =>
  result.withHeaders("user" -> "someUser")
}