【问题标题】:Sails.js socket.io general securitySails.js socket.io 一般安全性
【发布时间】:2015-07-11 22:06:27
【问题描述】:

使用风帆插座。 从浏览器中,我可以获得用户 ID 为 1 的所有“任务”。 我现在可以监听 'task' 事件并在动词中查找 'created' 以获取新任务并将它们添加到列表中。

但是,无论用户如何,我都会从所有创建的任务中获取事件。这似乎是我作为一个主要的安全问题。只需跳转到控制台并设置一个侦听器,即可在任何用户创建新任务时收到通知。

我环顾了一段时间,但找不到有关该主题的任何帖子。 对这种事情不熟悉 - 有人可以帮忙吗?

在 Sails 中通过 socket.io 处理列表的最佳做法是什么?

干杯!

【问题讨论】:

    标签: sockets sails.js sails.io.js


    【解决方案1】:

    这应该是您正在寻找的;它会阻止您订阅客户端上的所有现有任务。它仅在您登录时订阅并且仅订阅属于您的任务。请记住,这只是为您的应用实施安全 REST API 的第一步 - 但它应该让您开始。

    在您的客户端应用程序中,您将编写:

    socket.on('connect', function socketConnected()
    {
        // This subscribes the user to all tasks that belong to him and only him.
        socket.get('/task/subscribe', null, function response(data, jwres)
        {
            // We don’t really care about the response.
        });
    
        // This 1.) creates a new task and 2.) subscribes the user to that task.
        // If the 'rest' blueprint is on, POSTing to /task gets redirected to TaskController.create automatically by sails.
        // If it's not on, you write "socket.get('/task/create' ..."
        socket.post('/task', {name : 'MyNewTask'}, function response(data, jwres)
        {
            // Add the created task inside of 'data' to your client side app.
        });
    })
    

    然后在 TaskController.js 中你会写:

    subscribe : function(req, res)
    {
        // Is the user logged in?
        if(!req.session.user)
        {
            return res.badRequest();
        }
    
        // Find all tasks that belong to the currently logged in user.
        Task.find({userID : req.session.user.id}, findUsersCB(err, tasks)
        {
            // Subscribe the user to all of his tasks.
            Task.subscribe(req.socket, tasks);
    
            // Send user's tasks back to the client.
            res.json(tasks);
        });
    }
    
    create : function(req, res)
    {
        //Is the user logged in?
        if(!req.session.user)
        {
            return res.badRequest();
        }
    
        var taskToBeCreated = 
        {
            name : req.param('name'),
            userID : req.session.user.id;
        };
    
        // Attempt to create the given task.
        Task.create(taskToBeCreated, function createTaskCB(err, createdTask)
        {
            // Subscribe the user to the newly-created task.
            Task.subscribe(req.socket, createdTask);
    
            // Send user's task back to the client.
            res.json(task);
        });
    }
    

    我没有展示“更新”和“销毁”操作的示例,但两者的想法是相同的。

    【讨论】:

    • 感谢 Alex 的及时回复。但是,在您的代码中,创建新任务时不会向套接字订阅者发送任何事件。我相信这就是我的问题所在;按照 Sails 文档的建议使用 publishCreate 并在蓝图中使用,将创建的事件发送给所有订阅者 - 无论他们是否被授权。
    • 实际上,您还需要一个 Model.watch 来订阅创建/销毁事件。但是我们如何阻止它们被广播给所有人呢?
    • 嗯,我只是想澄清一下,您是否只想在属于他的任务被更改/删除时通知用户?
    • 这两种情况 - 当新任务从其他位置(例如移动设备)添加到列表时也是如此。用户/任务不是一个很好的例子(为了简单起见,我正在抽象)。更现实的是:一个Group可以有很多Task,也可以有很多User。因此,组中的每个用户都可以查看任务列表;添加新任务时,需要通知(然后订阅)新任务的组关联用户。这一切都相当直截了当——除了我如何保护第 1 组任务列表的订阅者不被通知第 2 组有新任务。
    猜你喜欢
    • 2018-01-16
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2016-12-24
    • 2011-11-19
    • 2012-01-26
    相关资源
    最近更新 更多