如何保护不同用户组的路由

时间:2013-07-31 15:14:43

标签: authentication backbone.js backbone-routing

我正在使用backbone.js构建一个应用程序并且想知道如何保护不同用户组的路由。

我看过许多教程,其中包含一些简单的身份验证方法,但我找不到任何有关用户组的信息。

假设我的应用程序有2个用户组:admins(读/写)和guest(读取)。如何使用backbone.js设置安全身份验证系统,以便访客无法打开http://example.com/foo/1/edit

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您可以让一台路由器为您管理所有路由,然后您可以侦听路由器的“所有”事件,以查看用户尝试导航到哪条路由。然后,您可以根据用户和路线决定是否允许他去那里。这样的事情可能有用:

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});
    }
}

答案 1 :(得分:1)

一种选择是仅在用户位于管理员组中时才设置路由。

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]);

无论如何,这种方法有一些不同的设置选项。

此方法的优点是您无需检查用户导航到的每条路径的路由和用户权限。路线设置或不设置。

如果您的用户能够升级到管理员权限,则将路由设置逻辑包装在一个函数中,并在授予用户管理员访问权限时调用它。

除此之外,据我所知,无法在前端设置安全的身份验证系统。无论您采用何种方法,您还必须检查服务器端的权限。