我正在寻找一个好的解决方案,在使用Play/Scala/ReactiveMongo开发的web应用程序中记录DB更改。我需要知道是谁改变了什么。
我有一个单独的层,即服务,所有数据访问和业务逻辑都发生在其中。所有的保存/更新/删除都是通过某些方法完成的,所以我可以用3或4种方法安全地记录它们,但我需要用户身份。
我无法访问服务中的当前用户!没有全局HttpContext或Request之类的东西可以让我获取用户身份(当然,我认为这种获取用户身份的方式是不正确的)。
我有一个解决方案:
向所有有副作用的服务方法(更改DB)添加一个隐式参数,并将用户标识传递给它们。
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)
//...
}
糟糕的是,我不得不向那些服务方法添加隐式参数。难道没有另一种解决方案可以在不污染方法签名的情况下获得当前用户吗。
简单地将UserIdentity
作为参数添加到函数中有什么问题?知道用户是谁似乎对您的业务逻辑很重要——毕竟,今天您要记录谁执行了操作,明天您要确保允许该特定用户执行操作。
我只想使用一个真正的UserIdentity
对象,而不是WrappedRequest
,您的服务不需要干扰WrappedRequest
实例。