仅按 token 中的 userId 显示数据

Show data only by userId in token

我用谷歌搜索 :) 但我找不到如何正确保护端点的解决方案,问题是当我签署用户时我有令牌并且我的 userId 是 1 然后我可以进行 GET 和 POST请求,但如果我使用路由示例:blablabla.com/users/1 我可以看到所有数据和 blablabla.com/users/2 我也可以看到所有数据。如何限制和仅显示已签名的 id 的数据,但对其余 id 发出禁止请求

感谢您的回复

您可以使用策略来实现这一点。 首先,您必须创建自定义策略。

创建一个文件api/policies/isAuthorised.js

module.exports = function (req, res, next) {
  let token;
  if (req.headers && req.headers.authorization) {
    const parts = req.headers.authorization.split(' ');
    if (parts.length === 2) {
      const scheme = parts[0];
      const credentials = parts[1];
      if (/^Bearer$/i.test(scheme)) {
        token = credentials;
      }
    } else {
      return res.status(401).json({
        message: 'Format is Authorization: Bearer [token]'
      });
    }
  } else if (req.param('token')) {
    token = req.param('token');

    delete req.query.token;
  } else {
    return res.status(401).json({
      message: 'No authorization header was found'
    });
  }
  // replace it with you own token verfication mechanism
  sails.helpers.jwt.verify(token, (err, decoded) => {
    if (err) {
      return res.status(401).json({
        message: 'Invalid Token!'
      });
    }
    req.token = token;
    User.findOne({
      id: decoded.userid
    }).then((user) => {
      req.currentUser = user;
      next();
    });
  });

};

此策略将确保用户使用有效令牌进行访问。 您需要另一项政策来仅限于自己的文件。 在文件 api/policies/isOwner.js

中创建另一个
module.exports = function (req, res, next) {
  try {
    switch (req.options.model) {
      case 'user': {
        User.findOne({
          id: req.param('id')
        }).then(
          (user) => {
            if (!user) {
              return res.status(401).json({
                message: 'Invalid request'
              });
            }
            if ( user.id === req.currentUser.id) {
              next();
            }
            else {
              return res.status(401).json({
                message: 'Invalid request'
              });
            }
          }
        );
        break;
      }
      default: {
        return res.status(401).json({
          message: 'Invalid request'
        });
      }
    }

  } catch (error) {
    return res.status(401).json({
      message: 'Bad Request'
    });
  }
};

现在将这两个策略应用于您的控制器

config/policies.js

module.exports.policies = {

  '*': false,
  UserController: {
    '*': false, //this will prevent accessing any other api such as delelt update etc.
    'findOne': ['isAuthorised', 'isOwner'],
  },
};