【问题标题】:How to protect routes for different user groups如何保护不同用户组的路由
【发布时间】:2013-08-01 04:58:49
【问题描述】:

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

我看过很多关于一些简单身份验证方法的教程,但我没有找到任何关于用户组的信息。

假设我的应用有 2 个用户组:管理员(读/写)和访客(读)。如何使用backbone.js 设置一个安全的身份验证系统,使客人无法打开http://example.com/foo/1/edit

有什么想法吗?

【问题讨论】:

    标签: authentication backbone.js backbone-routing


    【解决方案1】:

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

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

    【讨论】:

    • 好主意!我今晚要测试一下
    【解决方案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]);
    

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

    这种方法的优点是您不必检查用户导航到的每条路线的路线和用户权限。路由已设置或未设置。

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

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

    【讨论】:

      猜你喜欢
      • 2018-08-20
      • 2017-05-15
      • 1970-01-01
      • 2017-09-11
      • 2022-11-16
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多