Как защитить маршруты для разных групп пользователей

Я создаю приложение с backbone.js и задаюсь вопросом, как защитить маршруты для разных групп пользователей.

Я видел много руководств с некоторыми простыми методами аутентификации, но не нашел никакой информации о группах пользователей.

Допустим, у меня есть 2 группы пользователей для моего приложения: администраторы (чтение/запись) и гости (чтение). Как настроить безопасную систему аутентификации с помощью backbone.js, чтобы гости не могли открывать http://example.com/foo/1/edit?

Есть идеи?


person Slevin    schedule 31.07.2013    source источник


Ответы (2)


Один из вариантов — настраивать маршруты только в том случае, если пользователь входит в группу администраторов.

var router = new appRouter();

if (user.group === 'admin') {
  router.route('foo/:id/edit','edit',function {
    // your admin route logic here.
  });

  // or define the function in your router and reference it
  // such as: router.route('foo/:id/edit','edit',router.edit);
}

Backbone.history.start();

Если у вас было много маршрутов, вы можете создать объект, который содержит ваши административные маршруты, как показано ниже: (хотя, возможно, вы захотите добавить свойство для имени маршрута)

var adminRoutes = {
  'foo/:id/edit':function() {
       // your logic here
   },
  'another/route': // same set-up as above
  ...
};

Затем установите их в своем условии if с помощью цикла:

for (var k in adminRoutes)
  router.route(k,k,adminRoutes[k]);

В любом случае, есть несколько различных вариантов настройки этого метода.

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

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

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

person fbynite    schedule 01.08.2013

У вас может быть один маршрутизатор, управляющий всеми маршрутами для вас, а затем вы можете прослушивать событие «все» маршрутизатора, чтобы увидеть, по какому маршруту пытается перейти пользователь. Затем вы можете решить на основе пользователя и маршрута, разрешено ли ему идти туда или нет. Что-то вроде этого может сработать:

app.router.on("all",function(a){
    var routeRegex = /^route:(.*)$/g;
    var routeType = a.match(/route:(.*)$/)[1];

 if( routeType === "edit" && !app.isCurrentUserAllowedAdminAccess() ){
       //re-route the user to a different page
       app.router.navigate("user/access_denied", {trigger:true});
    }
}
person Trunal Bhanse    schedule 31.07.2013
comment
Отличная идея! сегодня вечером буду тестировать - person Slevin; 31.07.2013