6

我正在制作一个具有不同访问级别的 API,“客户端”可能只能读取。但“管理员”必须具有写入权限。每次检查不同的角色作为 Sails.js 中的策略,并在 req.session 中设置权限。

我只需要让“客户端”无法访问创建、更新和删除操作,因此我创建了一个具有这些 CRUD 操作的控制器并检查用户是否具有正确的角色。所有访问受限的操作都通过 routes.js 重定向到此控制器。

现在我的问题是,当我删除如下条目时: Category.destroy(req.param('id')); 给我 undefined 并且没有 done 方法。与文档中提到的不同,我设法通过创建这个来解决问题:

   var deleted = Category.destroy(req.param('id'), function(err, status) { 
    if (status == 1){
      res.json({message: 'Category is deleted'});
    } else {
      res.json({message: 'Oops, something went wrong'});
    }
  });

但是必须有另一种方法来将身份验证应用于这些基本操作。因为现在我必须编写所有动作。

我写的删除函数的代码有问题吗?是否可以应用策略并重定向到默认模型操作,就好像根本没有身份验证一样?

4

3 回答 3

12

您可以在ModelsorControllers级别定义策略。这是来自/config/policies.js.

module.exports.policies = {
    // Default policy (allow public access)
    '*': true,
    'events': 'eventsPolicy', // Policy for a Model

    someController: { // Policy for a Controller
        // Apply the "authenticated" policy to all actions
        '*': 'authenticated',

        // For someAction, apply 'somePolicy' instead
        someAction: 'somePolicy'
    }
};

在下面api/policies是您可以定义访问级别的地方。

module.exports = function (req, res, next) {
    if (req.session.user) {
        var action = req.param('action');
        if (action == "create") {
            req.body.userId = req.session.user.id;
            req.body.username = req.session.user.username;
        }
        next();
    } else {
        res.send("You're not authenticated.", 403);
    }
};

希望这可以帮助。

于 2013-07-08T02:05:44.727 回答
2

刚刚修改了所有策略并重命名了控制器,如 de CLI 中所述:'sails generate model example' 提供有关控制器被命名为单数的通知。所以我不需要将所有模型动作重定向到复数控制器(示例)。现在所有基本的 CRUD 操作都在正常工作。

Sails.js 视频教程对我帮助很大:http ://www.youtube.com/watch?feature=player_embedded&v=GK-​​tFvpIR7c

于 2013-04-18T08:56:23.753 回答
0

我的猜测(我自己不是 Sails 用户)是你要么传递一个回调,要么你会得到一个有done()方法的对象:

Category.destroy(id, function(...) {...});      // method 1
Category.destroy(id).done(function(...) {...}); // method 2
于 2013-04-17T13:46:33.513 回答