如何使用JayData定制OData服务器?

3

我对JayData还很新,所以这可能听起来像一个愚蠢的问题。 我已经阅读了这里的OData服务器教程:http://jaydata.org/blog/install-your-own-odata-server-with-nodejs-and-mongodb - 令人印象深刻的是,人们可以轻松设置一个OData提供程序。但是,该教程没有详细介绍如何自定义提供程序。

我想看看如何使用自定义数据库设置它,以及如何向OData服务器添加身份验证/授权层。我的意思是,并非每个用户都有权限访问每个实体,也不是每个用户都有权限添加新实体。

我应该如何处理这些用例与JayData?

4个回答

2

更新:

以下是两篇文章,可以帮助您入门:

在这些文章中经常使用的$data.createODataServer方法是一个方便的方法,它将连接/express管道隐藏起来。要与管道交互,请查看位于node_modules / odata-server文件夹中的$data.createODataServer函数的方法体。


请忽略下面的文本

身份验证必须通过连接管道解决,有许多中间件可用于此。

对于授权,EntityContext构造函数接受一个授权函数,该函数必须支持Promise。

所有允许的授权者看起来像这样。

  function checkPerm(access, user, entitysets, callback) {
        var pHandler = new $data.PromiseHandler();
        var clbWrapper = pHandler.createCallback(callback);
        var pHandlerResult = pHandler.getPromise();
        clbWrapper.success(true); // this grants a joker rw permission to everyone
        //consult user, entitySet and acces to decide on success/error
        //since you return a promise you can call async stuff (will not be fast though)
        return pHandlerResult;
    }

我需要与团队成员咨询一下如何将此语法传递到构建过程中,但我可以确认这是可行的并且受支持的。我会尽快回复答案。

在验证用户身份后,您还可以使用EntityContext级别事件来拦截读取/更新/创建/删除操作。

$data.EntityContext.extend({
   MySet: { type: $data.EntitySet, elementType: Foobar,
            beforeDelete: function(items) {
               //if delete was in batch you'll get multiple items
               //check items here,access this.request.user 
               return false // deny access
            }

});

还有一种声明性的方法,您可以在实体集上注释角色名称及其权限,这要求您的用户对象实际上具有一个具有角色名称数组的角色字段。


嗨@Peter,谢谢你的回答!不过,能够看到一个工作示例会很好,因为我还没有足够的专业知识来自己拼凑它。 - Venemo
谢谢@Peter,我期待着看到它 :) - Venemo
@Venemo更新了帖子,并附上了您请求的信息的参考资料。 - Peter Aron Zentai
感谢您的努力,正如您所说,这个例子确实足够简单。 :) 我很好奇,所以我也试图在您的API文档中查找createODataServer函数,但是找不到它。至少它不在$data$data.oDataServer部分中。您能告诉我在哪里寻找它吗? - Venemo
好的,谢谢@Peter的帮助。我将标记此答案为已接受,并尝试示例代码。 :) - Venemo
显示剩余3条评论

1
我们还在使用JayData来作为我们的OData服务层,并且我已经用它实现了一个非常简单的基本身份验证。 由于JayData使用Express,因此我们可以利用Express的功能。对于基本身份验证,最简单的方法是:
app.use(c.session({ secret: 'session key' }));
// Authenticator
app.use(c.basicAuth('admin', 'admin'));
app.use("/odata.svc", $data.JayService.OData.Utils.simpleBodyReader());

您还可以参考这篇文章,了解如何在 Express 中进行身份验证的详细信息:http://blog.modulus.io/nodejs-and-express-basic-authentication

谢谢。


1
我最近也在研究oData,由于我们的平台同时在node和C#中开发,自然会关注JayStorm。据我了解,JayStorm的技术细节使得Connect和Express的全部功能都可用,从而实现了这个话题。我们使用Restify来提供平台的私有API,并为此编写了许多中间件模块。

你好,请问您能否更具体一些? - Venemo
我的意思是,您可以编写/重用Connect或Express中间件模块,将其放置在JayStorm的请求/响应管道中,并且这些模块可以执行您需要的任何操作。我们已经为Restify和Connect编写了类似的中间件模块,以处理身份验证/授权/内容过滤/声明/反CSRF/反XSS等功能。 - Dokie

-2

我写了那篇博客文章,我在JayData工作。 你所说的自定义数据库是什么意思? 我们编写了一个用于身份验证和授权的中间件,但它不是开源的。我们可能会稍后发布它。 我们有一个名为JayStorm的服务,它有一个免费版本,也许适合你。 我们可能会发布一个设备版本。


嗨Gábor,我知道所讨论的组件不是开源的。问题是如何为我的应用程序实现这样的中间件。 :) - Venemo
嗨,感谢您的推荐!目前我只是在业余水平上尝试一些东西,所以我更感兴趣的是尝试使用OData和Node.js进行实验 - 但将来我可能会考虑使用您的服务 :) - Venemo
我读了推荐的博客文章,但它似乎是关于其他事情的。但它并不包含我问题的答案。:( - Venemo
1
@Venemo 有方法可以实现。看看我的回复 - 可能会有所帮助。我会尽快回来,提供更详细的操作说明。 - Peter Aron Zentai
我们发布了两篇关于这个主题的新博客文章。 - Gabor Dolla
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接