假设我有一个名为protect
的方法的对象。
这应该带有JValue => JValue
(非通用参数)的函数。
def protect(func: (JValue) => JValue) = {
if (Something.is) {
InMemoryResponse(Array(), Nil, Nil, 200)
} else {
InMemoryResponse(Array(), Nil, Nil, 401)
}
}
我现在如何调用函数传递其原始参数?
目标是在响应REST请求之前检查用户会话是否存在。如果没有,则会自动返回401 Forbidden
,如下所示。在这种情况下,我想传递Users.getUsers
作为参数函数,并将其限制为函数的参数。
所以在protect
内,如果Session
存在,该函数将执行并显示。
serve {
case "user" :: limit :: Nil JsonGet _ =>
AuthorizedReq.protect(json => Users.getUsers(limit))
答案 0 :(得分: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的默认身份验证机制,缺少文档。
答案 1 :(得分:0)
据我所知,你不实际上将函数Users.getUsers
作为参数传递。您正在使用limit
参数传递调用此函数的函数。
因为当您创建作为参数传递的匿名函数时,您还会创建一个闭包,limit
的值仍然可用于该函数(尽管您不可见)。您应该能够在没有参数的情况下调用func
并使其正常工作。