关于如何使用 app.set() 和 app.get() 返回值

About how the value is returned using app.set() and app.get()

我正在使用 connect-roles and loopback 释放对页面的访问权限,但我有一个相关问题,关于如何收集客户的角色并通过连接角色读取会话并响应路由。

例如,当客户端登录时,我加载了一个包含客户端角色的字符串,并在控制页面访问的函数中访问它。

我有这个疑问,因为我正在完成一项大规模服务,通常有多个客户端会话使用相同的存储和检查功能立即访问。

使用 app.set()app.get() 来存储客户的角色会更有效吗?

  app.get('/session-details', function (req, res) {
    var AccessToken = app.models.AccessToken;
    AccessToken.findForRequest(req, {}, function (aux, accesstoken) {
      // console.log(aux, accesstoken);
      if (accesstoken == undefined) {
        res.status(401);
        res.send({
          'Error': 'Unauthorized',
          'Message': 'You need to be authenticated to access this endpoint'
        });
      } else {
        var UserModel = app.models.user;
        UserModel.findById(accesstoken.userId, function (err, user) {
          // console.log(user);
          res.status(200);
          res.json(user);
          // storage employee role
          app.set('employeeRole', user.accessLevel);
        });
      }
    });
  });

直到那一刻,一切都如愿以偿,我收集了加载了客户端角色的字符串,并在我创建了一个连接角色函数来验证所有这些之后不久。

var dsConfig = require('../datasources.json');
var path = require('path');

module.exports = function (app) {
  var User = app.models.user;
  var ConnectRoles = require('connect-roles');
  const employeeFunction = 'Developer';

  var user = new ConnectRoles({
    failureHandler: function (req, res, action) {
      // optional function to customise code that runs when
      // user fails authorisation
      var accept = req.headers.accept || '';
      res.status(403);
      if (~accept.indexOf('ejs')) {
        res.send('Access Denied - You don\'t have permission to: ' + action);
      } else {
        res.render('access-denied', {action: action});
        // here
        console.log(app.get('employeeRole'));
      }
    }
  });

  user.use('authorize access private page', function (req) {
    if (employeeFunction === 'Manager') {
      return true;
    }
  });

  app.get('/private/page', user.can('authorize access private page'), function (req, res) {
    res.render('channel-new');
  });

  app.use(user.middleware());
};

尤其是此时此刻,当我使用 console.log(app.get('employeeRole')); 会不会同时连接有问题?

  app.get('/private/page', user.can('authorize access private page'), function (req, res) {
    res.render('channel-new');
  });

示例客户端 x 和 y 同时连接并使用相同的函数来存储有关您的会话的数据?

当我在 console.log(app.get('employeeRole')); 中打印字符串时更具体如果我的疑问得到纠正,我对同时连接没有问题我将加载一个新变量 var employeeFunction = app.get('employeeRole'); 所以是的我的函数可以使用包含我的客户端角色的对象 if (employeeFunction === 'Any Role') 如果在字符串中加载的角色包含所需的角色 路由 它释放页面 否则它使用 failureHandler.

的回调

我的测试环境仅限于这种类型的测试所以我希望你能在这方面帮助我xD

您可以创建一个会话映射(如哈希映射),而不是使用 app.set。我在我的一个项目中集成了同样的东西,它工作得很好。下面是它的代码以及如何访问它:

hashmap.js

var hashmapSession = {};

exports.auth = auth = {
  set : function(key, value){
    hashmapSession[key] = value;
  },
  get : function(key){
    return hashmapSession[key];
  },
  delete : function(key){
    delete hashmapSession[key];
  },
  all : function(){
    return hashmapSession;
  }
};

app.js

var hashmap = require('./hashmap');
var testObj = { id : 1, name : "john doe" };

hashmap.auth.set('employeeRole', testObj);
hashmap.auth.get('employeeRole');
hashmap.auth.all();
hashmap.auth.delete('employeeRole');