О том, как значение возвращается с помощью app.set () и app.get () - PullRequest
0 голосов
/ 27 мая 2018

Я освобождаю доступ к страницам, используя connect-role и loopback , но у меня есть уместный вопрос о том, как я могу собрать роль клиента и с помощью connect-ролей прочитатьсеанс и ответ на маршрут.

Пример, когда клиент входит в систему, я загружаю строку, содержащую роль клиента, и получаю к ней доступ в функции, которая контролирует доступ к страницам.

У меня есть это сомнениепотому что я заканчиваю крупномасштабную службу, в которой обычно есть несколько клиентских сессий, к которым мгновенно обращаются с использованием одной и той же функции хранения и проверки.

Было бы эффективно сохранить роль клиента, используя 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);
        });
      }
    });
  });

До этого момента все происходит так, как нужно, я собираю строку, загруженную ролью клиента, и вскоре после этого создаю функцию connect-role для проверки всего этого.

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

1 Ответ

0 голосов
/ 07 июня 2018

Вместо использования app.set вы можете создать карту сеанса (например, hashmaps).Я интегрировал то же самое в один из моих проектов, и он работает безупречно.Ниже приведен код и способ доступа к нему:

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');
...