Yeoman Angular Fullstack — как защитить маршруты?

Я создал новый маршрут «Комнаты» с помощью генератора и смоделировал свой $stateProvider на маршруте администратора.

.state('admin', {
    url: '/admin',
    templateUrl: 'app/admin/admin.html',
    controller: 'AdminController',
    controllerAs: 'admin',
    authenticate: 'admin'
  });

Vs

$stateProvider
  .state('rooms', {
    url: '/rooms',
    templateUrl: 'app/rooms/rooms.html',
    controller: 'RoomsCtrl',
    controllerAs: 'rooms',
    authenticate: 'admin'
  });

Но мой маршрут все еще отображается без аутентификации!

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

Кто-нибудь может помочь?

Спасибо


person stevejvv    schedule 11.12.2015    source источник
comment
проверьте, определена ли у вас фабрика службы перехватчиков и вызвана ли она в вашем app.js   -  person aitnasser    schedule 11.12.2015


Ответы (2)


ваш контроллер должен быть таким:

     angular.module('auth8App').controller('RoomsCtrl', function ($scope,Auth,$location) {

               //check if the user is logged-in
                Auth.isLoggedInAsync(function(loggedIn) {
                        if (!loggedIn) {    
                       //if the user is not logged  Redirect to login
                          event.preventDefault();
                          $location.path('/login');
                        }
                      });
                    $scope.message = 'Hello';
                });
person aitnasser    schedule 11.12.2015

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

    .config(function ($stateProvider, $urlRouterProvider, $locationProvider, $httpProvider) {
    $urlRouterProvider
      .otherwise('/');

    $locationProvider.html5Mode(true);
    $httpProvider.interceptors.push('authInterceptor');
  })

  .factory('authInterceptor', function ($rootScope, $q, $cookieStore, $location) {
    return {
      // Add authorization token to headers
      request: function (config) {
        config.headers = config.headers || {};
        if ($cookieStore.get('token')) {
          config.headers.Authorization = 'Bearer ' + $cookieStore.get('token');
        }
        return config;
      },

      // Intercept 401s and redirect you to login
      responseError: function(response) {
        if(response.status === 401) {
          $location.path('/login');
          // remove any stale tokens
          $cookieStore.remove('token');
          return $q.reject(response);
        }
        else {
          return $q.reject(response);
        }
      }
    };
  })

  .run(function ($rootScope, $location, Auth) {
    // 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) {
          event.preventDefault();
          $location.path('/login');
        }
      });
    });
  });
person aitnasser    schedule 11.12.2015
comment
теперь проверьте, вызывается ли промежуточное ПО аутентификации в конечной точке вашего сервера. - person aitnasser; 11.12.2015
comment
Эй, спасибо за ваш ответ. Да, у меня есть authIntereptor plunker ... - person stevejvv; 11.12.2015
comment
теперь проверьте, вызывается ли промежуточное ПО аутентификации в конечной точке вашего сервера. - person aitnasser; 11.12.2015
comment
похоже на это: /** import errors from './components/errors'; import path from 'path'; module.exports = function(app) { // Insert routes below app.use('/api/things', require('./api/thing')); app.use('/api/users', require('./api/user')); app.use('/auth', require('./auth')); app.route('/:url(api|auth|components|app|bower_components|assets)/*') .get(errors[404]); app.route('/*') .get(function(req, res) { res.sendFile(path.resolve(app.get('appPath') + '/index.html')); }); }; - person stevejvv; 11.12.2015
comment
` 'использовать строгий'; здесь ничего особенного: angular.module('auth8App') .controller('RoomsCtrl', function ($scope) { $scope.message = 'Hello'; }); ` - person stevejvv; 11.12.2015
comment
и room.js: angular.module('auth8App') .config(function ($stateProvider) { $stateProvider .state('rooms', { url: '/rooms', templateUrl: 'app/rooms/rooms.html', controller: 'RoomsCtrl', controllerAs: 'rooms', authenticate: 'admin' }); }); - person stevejvv; 11.12.2015
comment
Я получаю сообщение об ошибке: TypeError: Auth.isLoggedIn(...).then не работает в router.decorator.js:18? - person stevejvv; 11.12.2015