2015-10-19 38 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