【问题标题】:Play Framework Multi-Tenant FilterPlay Framework 多租户过滤器
【发布时间】:2023-03-25 02:45:02
【问题描述】:

我正在尝试使用 Play Framework 2.2 构建多租户应用程序,但遇到了问题。我想在全局onRouteRequest(或Java 中的onRequest)中设置一个会话密钥,用于标识用户请求的域的站点ID。在许多其他框架中,这种类型的东西是无痛的(例如 Django),但我了解到 Play 中的会话对象显然是不可变的。

所以,现在,我有这样的事情:

override def onRouteRequest(request: RequestHeader): Option[Handler] = {
    if (request.session.get("site").isEmpty){   
      val id = models.Site.getSiteUIDFromURL(request.host.toLowerCase()).toString()
      if (!id.isEmpty){
       //what goes here to set the session?
      }else{
        //not found - redirect to a general notFound page
      }
    }
    super.onRouteRequest(request)
  }

而且,虽然它不是使用数据库查找的最有效方法,但它现在可以用于测试。我需要能够在全局中设置会话密钥,但完全不知道如何做到这一点。如果有更好的方法,我会全力以赴(也许包装我的控制器?)。

我对 Java 或 Scala 中的解决方案示例持开放态度。

【问题讨论】:

    标签: java scala playframework playframework-2.0 playframework-2.2


    【解决方案1】:

    将 Play 中的操作视为函数调用,输入是请求,输出是结果。如果要更改包装函数调用的结果,则必须首先调用该函数,然后应用更改。向会话添加密钥会改变结果,因为会话是在会话 cookie 中发送到客户端的。在上面的代码中,您尝试在有结果要更改之前进行更改,即在您调用super.onRouteRequest 之前。

    如果您根本不需要修改路由,则不要在onRouteRequest 中执行此操作,在过滤器中执行此操作,那里更容易。但是假设您确实需要修改路由,那么您需要对返回的处理程序应用过滤器。这可能是这样的:

    override def onRouteRequest(request: RequestHeader): Option[Handler] = {
      val maybeSite: Option[String] = request.session.get("site").orElse {
        // Let's just assume that getSiteUIDFromUrl returns Option[String], always use Option if you're returning values that might not exist.
        models.Site.getSiteUIDFromURL(request.host.toLowerCase())
      }
    
      maybeSite.flatMap { site =>
        super.onRouteRequest(request).map {
          case e: EssentialAction => EssentialAction { req =>
            e(req).map(_.withSession("site" -> site))
          }
          case other => other
        }
      }
    }
    

    查看 CSRFFilter 的源代码,查看如何在过滤器中向会话添加内容的示例。

    【讨论】:

    • 这太好了,谢谢。我要试试。到目前为止,我只是使用设置会话值的动作组合来包装我的控制器。过滤器看起来非常强大——我只是希望有更多的文档。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多