0

假设我有一个对象,其方法名为protect.

这应该采用带有JValue => JValue(非泛型参数)的函数。

 def protect(func: (JValue) => JValue) = {
        if (Something.is) {
            InMemoryResponse(Array(), Nil, Nil, 200)
        } else {
            InMemoryResponse(Array(), Nil, Nil, 401)
        }
  }

我现在如何调用传递其原始参数的函数?

目标是在响应 REST 请求之前检查用户会话是否存在。如果没有,则 a401 Forbidden将自动返回,如下所示。在这种情况下,我想Users.getUsers作为参数函数传递,并将限制作为参数传递给函数。

所以在里面protect,如果Session存在,该函数将执行并显示。

serve {
    case "user" :: limit :: Nil JsonGet _ =>
        AuthorizedReq.protect(json => Users.getUsers(limit))
4

2 回答 2

2

我最终使用了这个:

object AuthorizedReq extends Logger {
    private[this] val error: JValue = ("error" -> "Unauthorized request");
    def protect(func: (JValue) => JValue, json: JValue): JValue = {
        if (LoginSession.is) {
                new OkResponse
                func(json)
            } else {
                new UnauthorizedResponse
                error;
            }
        }
    }
}

结合:

serve {
    case "user" :: limit :: Nil JsonPost json -> _ =>
        for {
            json <- AuthorizedReq.protect(json => Users.getUsers(json), json)
        } yield json: JValue
}

如果用户未通过身份验证,则服务器以 响应401,否则执行原始函数。引入角色和领域应该很容易。

这取代了缺乏文档的 Lift 的默认身份验证机制。

于 2013-06-03T16:23:39.547 回答
0

据我所知,您实际上并没有将函数Users.getUsers作为参数传递。您正在使用参数传递一个调用此函数的limit函数。

因为当您创建作为参数传递的匿名函数时,您还创建了一个闭包,该函数的值limit仍然可用(尽管对您不可见)。您应该能够func不带参数地调用并让它正常工作。

于 2013-06-03T15:33:49.133 回答