2015-10-19 36 views
0

我与mean.js首次工作,我看到已经有建于身份验证提供者。如果用户没有登录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崩溃的应用程序。

有人可以帮助我做到这一点吗?

回答

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

感谢你的建议,是否有可能合并所有这些在meanjs中没有问题? –

+0

这很难,因为项目使用不同的结构。角度完整堆栈使用“特征”设计,而mean.js使用“组件”结构,因此所有控制器等全部位于一个文件夹中 - 除此之外,语法上存在差异。 – venturz909