Аутентификация на stateProvider для конкретного пользователя (angular-fullstack)

Я использую генератор angular-fullstack для своего проекта (https://github.com/angular-fullstack/generator-angular-fullstack), и у меня есть страница запроса на моем веб-сайте, которая должна быть доступна пользователям с определенной ролью (администратор). Эта страница также должна быть доступна пользователю, создавшему запрос.

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

Есть ли способ управлять этим случаем в stateProvider или я должен делать это в своем контроллере страницы после перенаправления $state?

Спасибо за ваше время


person haplo31    schedule 29.06.2016    source источник


Ответы (1)


Авторизация для конкретных role может быть выполнена, но вам нужно изменить некоторый код.

Добавьте новое поле access в файл конфигурации state следующим образом. Давайте сохраним массив authRequiredFor в том, который содержит роли, требующие авторизации для доступа к этому конкретному состоянию myState.

angular.module('myApp')
    .config(function ($stateProvider) {
    $stateProvider
      .state('myState', {
        url: '...',
        templateUrl: '...',
        controller: '...',
        access: {
            authRequiredFor: ['role1', 'role2']
        }                
    });
});

В вашем файле app.js в функции run() вам нужно добавить и изменить функцию обратного вызова $stateChangeStart, чтобы проверить, нужна ли пользователю аутентификация или нет перед доступом к какому-либо состоянию.

.run(function ($rootScope, $location, Auth, $state) {
    // Redirect to login if route requires auth and you're not logged in
    $rootScope.$on('$stateChangeStart', function (event, next) {
        Auth.isLoggedInAsync(function(loggedIn) {
            if (next.authenticate && !loggedIn) {
                $location.url('/login');
            }
            if (next.access) {  // check if the state config contains the field `access`
                var permissions = next.access;
                var userRole = Auth.getCurrentUser().role;
                if (permissions.authRequiredFor) {
                    // check if the logged in user's role matches with the roles in the array
                    if (permissions.authRequiredFor.indexOf(userRole) >= 0) {
                        $location.url('/login'); // or redirect him to some other url/state
                    }
                }
            }        
        });
    });
});

Надеюсь, это решит проблему.

person Chinni    schedule 07.07.2016