1

我正在寻找一个好的解决方案来记录使用 Play/Scala/ReactiveMongo 开发的 Web 应用程序中的数据库更改。我需要知道谁改变了什么。

我有一个单独的层,即服务,所有数据访问和业务逻辑都在其中发生。所有保存/更新/删除都是通过某些方法完成的,所以我可以用 3 或 4 种方法安全地记录它们,但我需要用户身份。

我无权访问服务中的当前用户!没有全局 HttpContext 或 Request 或类似的东西可以让我获取用户身份(我认为这种获取用户身份的方式当然是不正确的)。

我有一个解决方案:

为所有具有副作用的服务方法添加一个隐式参数(更改数据库)并将用户身份传递给它们。

def save(model: A)(implicit userIdentity: Option[UserIndentity] = None) = { ... }

当我包装默认请求时,它可以扩展 UserIdentity 特征,以便隐式请求与隐式参数匹配。

class MyRequest[A](...) extends WrappedRequest[A](request) extends UserIdentity

最后,动作可以使用这样的服务:

def index() = MyAction { implicit request =>
    //...
    defaultService.save(model)
    //...
}

不好的是我必须为这些服务方法添加隐式参数。是否有另一种解决方案可以在不污染方法签名的情况下获取当前用户。

4

1 回答 1

0

简单地将UserIdentity作为参数添加到您的函数有什么问题?了解用户是谁似乎对您的业务逻辑很重要——毕竟,今天您要记录谁执行了操作,明天您将要确保允许该特定用户执行此操作。

而且我只会使用一个真实的UserIdentity对象,而不是一些 hack WrappedRequest,您的服务不需要弄乱WrappedRequest实例。

于 2014-05-01T15:08:12.780 回答