Mean.js身份验证

时间:2015-10-19 09:37:03

标签: javascript angularjs angular-ui-router

我第一次使用mean.js,我发现已经内置了身份验证提供程序。

如果用户未登录,则会隐藏他们的测试文章页面链接,但如果我手动导航到/articles我可以看到页面...

我认为它不是很有用......

如果未登录,如何限制对所有页面的访问并在登录页面上重定向用户?

到目前为止我尝试的是:

angular.module('core')
.run(['$rootScope', '$state', '$location', 'Authentication', function ($rootScope, $state, $location, authentication) {
  $rootScope.$on('$stateChangeStart', function (event, toState) {
    var notRestricted;
    if (toState.name === 'page.signin') {
      notRestricted = true;
    } else {
      notRestricted = false;
    }
    if (notRestricted) {
      return;
    }
    var user = authentication.user;
    if (!user) {
      event.preventDefault();
      $state.go('page.signin');
    }
  });
}]);

但是,如果我在主页上导航,它会启动一个无限循环,导致$digest使应用程序崩溃。

有人可以帮我正确地做到这一点吗?

1 个答案:

答案 0 :(得分:0)

我建议你提取Daftmonk角度全堆栈的授权部分 - 这是最好的,这是我的auth starter

您需要做的就是在路线中添加一个布尔值来验证'像这样:

  function config($stateProvider) {
$stateProvider
  .state('main', {
    url: '/main',
    templateUrl: 'app/main/main.html',
    controller: 'MainCtrl',
    authenticate: true
  });

这就是app.js

中代码的样子
function config($httpProvider) {
    $httpProvider.interceptors.push('authInterceptor');
  }

  function run($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) {
          $location.path('/login');
        }
      });
    });
  }

  function authInterceptor($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);
        }
      }