Вопрос по connect, express, routes, session – Сеансы Express.js активируются на подмножестве маршрутов

3

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

Таким образом, для подмножества моих маршрутов я хочу активировать состояние сеанса, в то время как для дополнительного подмножества (остальные мои маршруты) экспресс-сеансы должны быть деактивированы, что позволяет кэшировать эти страницы.

Как я могу сделать это чистым способом?

Скажем, маршруты, для которых я хочу активировать сеансы: «/ kj% C3% B8p», «/ bibliotek»; и "/ зарегистрировать".

Я пробовал что-то вроде

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');

  var pageName = 'somepage';
  var oneYear = 1000*60*60*24*365;
  app.use(express.bodyParser());
  app.use('/kj%C3%B8p', express.cookieParser());
  app.use('/kj%C3%B8p', express.session({key: pageName, secret: 'someCode', store: new RedisStore, cookie: {path:'/', maxAge: (5*oneYear), httpOnly: true}}));
  app.use('/bibliotek', express.cookieParser());
  app.use('/bibliotek', express.session({key: pageName, secret: 'someCode', store: new RedisStore, cookie: {path: '/', maxAge: (5*oneYear), httpOnly: true}}));
  app.use('/registrer', express.cookieParser());
  app.use('/registrer', express.session({key: pageName, secret: 'someCode', store: new RedisStore, cookie: {path:'/', maxAge: (5*oneYear), httpOnly: true}}));

  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));

});

но это восстанавливает объект сеанса для каждого из трех маршрутов и выглядит довольно грязно. Какие-нибудь советы?

Ваш Ответ

1   ответ
5

к определенных URL. Это пример белого списка:

function allow(paths, fn) {
  return function(req, res, next) {
    if (~paths.indexOf(req.url)) {
      return fn(req, res, next);
    }
    next();
  }
}

Вы оборачиваете это вокруг своего промежуточного программного обеспечения как:

app.use(allow(['/bibliotek', '/registrer'], express.cookieParser()));

Вы можете использовать ту же технику и для других промежуточных программ. Это было основано насуть что экспресс-автор показал в irc.

Вау, это довольно чистое решение.
Функция allow - это просто функция, которая оборачивает промежуточное ПО, которое также является просто функцией. Если вам нужно сопоставить регулярные выражения в URL, используйте регулярные выражения.
Спасибо, очень чисто на самом деле. torgebo
С этим подходом возникают некоторые практические проблемы: - использование функции deny, похоже, не работает, поскольку другие источники на странице также вызывают app.use (например, изображения на странице вызывают app.use. пришлось бы указать это тоже.) torgebo
- «Разрешить» Функция работает с указанными маршрутами. Но если я хочу соответствовать маршруту, подобному & apos; / bibliotek /: id & apos; тогда, кажется, в app.use нет поддержки регулярных выражений. Решение здесь, кажется, состоит в том, чтобы вручную добавить регулярное выражение и вместо этого сравнить req.url с регулярным выражением в allow. Было бы неплохо сделать это сравнение автоматически с res.app.routes, но это кажется неопределенным при запуске приложения, поэтому переписывание, позволяющее использовать их автоматически, приводит к неприятным ошибкам. torgebo

Похожие вопросы