2015-03-25 3 views
2

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

1. как управлять передним концом, основанным на роли?

В настоящее время я ставлю глобальные флаги, такие как IsAdmin, isVolunteer, isGovt и т.д. для каждой роли и на основе их стоимости, я могу показать другой пользовательский интерфейс с помощью data-ng-if = "Global.isAdmin"

Является ли это правильно Подход. если нет, предложите правильный способ обработки пользовательского интерфейса.

2. Как управлять внутренним контуром и перенаправлять маршрут, если у пользователя нет авторизации?

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

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

это ролевой модуль.

angular.module('mean.users', ['permission']) 
.run(['permission', 'Global', '$q', 
    function(Permission, Global, $q) { 
     console.log('not anonumous'); 
     Permission 
      .defineRole('anonymous', function(stateParams) { 
       var deferred = $q.defer(); 
       if (Global.user) { 
        deferred.resolve(); 
       } else { 
        deferred.reject(); 
       } 
       return deferred.promise; 
      }) 
      .defineRole('admin', function(stateParams) { 
       if (Global.isAdmin) { 
        deferred.resolve(); 
       } else { 
        deferred.reject(); 
       } 
       return deferred.promise; 
      }) 
      .defineRole('govt', function(stateParams) { 
       if (Global.isGovt) { 
        deferred.resolve(); 
       } else { 
        deferred.reject(); 
       } 
       return deferred.promise; 
      }) 
      .defineRole('volunteer', function(stateParams) { 
       if (Global.isVolunteer) { 
        deferred.resolve(); 
       } else { 
        deferred.reject(); 
       } 
       return deferred.promise; 
      }); 

    } 
]); 

как связать выше configoured ролей в маршрутном файле

$stateProvider 
     .state('create user', { 
      url: '/users/create', 
      templateUrl: 'users/views/create.html', 
      resolve: { 
       loggedin: checkLoggedin 
      } 
     }) 
     .state('all users', { 
      url: '/users/list', 
      templateUrl: 'users/views/list.html', 
      data: { 
       permissions: { 
        only: ['admin'], 
        redirectTo: 'home' 
       } 
      } 
     }) 
     .state('show user', { 
      url: '/users/:userId/view', 
      templateUrl: 'users/views/view.html', 
      resolve: { 
       loggedin: checkLoggedin 
      } 
     }) 
     .state('edit user', { 
      url: '/users/:userId/edit', 
      templateUrl: 'users/views/edit.html', 
      data: { 
       permissions: { 
        only: ['admin'] 
       } 
      } 
     }) 
     .state('myprofile', { 
      url: '/users/:userId/me', 
      templateUrl: 'users/views/myprofile.html', 
      resolve: { 
       loggedin: checkLoggedin 
      } 

     }); 
+0

Я написал (-а) запись об этом http://jonsamwell.com/url-route-authorization-and-security-in-angular/ – Jon

+0

@JonSamwell Я думаю, что хорошо дать очень короткий ответ, по крайней мере концептуальный, а затем обратитесь к своему сообщению посмертно;) – diegoaguilar

ответ

0

Из ваших образцов коды, я предполагаю, что вы используете mean.io.

Это мой подход к управлению доступом на основе ролей на интерфейсе, в среднем.

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

$ mean user [email protected] --addRole production 
$ mean user [email protected] --addRole sales 

Затем у меня есть 2 маршрута для добавления в меню. В app.js моего пользовательского модуля отфильтровать эти маршруты по роли, так что ссылка не отображается на другие роли:

Report.menus.add({ 
    roles: ['production'], 
    title: 'Production reports', 
    link: 'production reports' 
}); 
Report.menus.add({ 
    roles: ['sales'], 
    title: 'Sales reports', 
    link: 'sales reports' 
}); 

Конечно, этого недостаточно, чтобы ограничить доступ в веб-интерфейсе. Вы можете легко указать на http://localhost:3000/#!/report/sales, и вы увидите отчет о продажах, есть ли у вас роль продаж или нет.

Трюк входит в файл public/routes/report.js моего настраиваемого модуля, где я фильтрую представления по ролям.

'use strict'; 

angular.module('mean.report').config(['$stateProvider', 
    function($stateProvider) { 
    // Check if user has role 
    var checkUserRole = function(role, $q, $timeout, $http, $location) { 
     // Initialize a new promise 
     var deferred = $q.defer(); 

     // Make an AJAX call to check if the user is logged in and get user data including roles 
     $http.get('/loggedin').success(function(user) { 
     // Authenticated 
     if (user !== '0' && (user.roles.indexOf(role) > -1 || user.roles.indexOf('admin') > -1)) $timeout(deferred.resolve); 

     // Not Authenticated 
     else { 
      $timeout(deferred.reject); 
      $location.url('/auth/login'); 
     } 
     }); 

     return deferred.promise; 
    }; 

    $stateProvider.state('report', { 
     url: '/report', 
     templateUrl: 'report/views/index.html' 
    }) 
    .state('production reports', { 
     url: '/report/production', 
     templateUrl: 'report/views/production.html', 
     resolve: { 
      loggedin: function($q, $timeout, $http, $location) { 
       return checkUserRole('production', $q, $timeout, $http, $location) 
      } 
     } 
    }) 
    .state('sales reports', { 
     url: '/report/sales', 
     templateUrl: 'report/views/sales.html', 
     resolve: { 
      loggedin: function($q, $timeout, $http, $location) { 
       return checkUserRole('sales', $q, $timeout, $http, $location) 
      } 
     } 
    }); 
    } 
]); 

В случае, если пользователь не прошел проверку подлинности, он перенаправляется на страницу входа в систему. Если у него есть неправильная роль, он перенаправляется на домашнюю страницу.

Этот подход основан на модуле статей. Надеюсь, поможет.

Смежные вопросы