【问题标题】:Sails.js authentication for model actions模型操作的 Sails.js 身份验证
【发布时间】:2013-04-10 07:29:26
【问题描述】:

我正在制作一个具有不同访问级别的 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'});
    }
  });

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

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

【问题讨论】:

    标签: node.js mongodb authentication sails.js


    【解决方案1】:

    您可以在ModelsControllers 级别定义策略。这是来自/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);
        }
    };
    

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        Category.destroy(id, function(...) {...});      // method 1
        Category.destroy(id).done(function(...) {...}); // method 2
        

        【讨论】:

        • 感谢您的回答。我认为风帆内的重新路由是不正确运作的一部分。现在有了新的重写,它可以正常工作。但是感谢您的宝贵时间!
        猜你喜欢
        • 2018-08-26
        • 1970-01-01
        • 1970-01-01
        • 2022-01-07
        • 2012-04-12
        • 1970-01-01
        • 2013-12-28
        • 2013-06-26
        • 1970-01-01
        相关资源
        最近更新 更多