2014-10-01 73 views
13

如果有人在未經身份驗證時嘗試擊中任何其他路由,我該如何重定向到登錄頁面?在AngularJS中有沒有「最好的」方法?重定向所有路由,如果未經過身份驗證,則登錄

似乎是一個常見的問題,但我似乎無法找到一種方法來做到這一點。預先感謝您的幫助。

+2

創建'$ routeChangeStart'或'$ stateChangeStart'偵聽器(用於ui路由器),檢查auth狀態,如果未通過身份驗證,則重定向至登錄。 – 2014-10-01 16:18:19

+0

感謝@martoncsukas的編輯。 – sturoid 2014-10-01 16:46:48

回答

20

這樣做的最好方法是設置一個'$ routeChangeStart'偵聽器來檢查'authProvider'服務函數,以驗證是否有用戶登錄。在我們的'app.js'或單獨的文件:

angular.module('myApp') 
    .run(['$rootScope', '$location', 'authProvider', function ($rootScope, $location,  authProvider) { 
     $rootScope.$on('$routeChangeStart', function (event) { 

     if (!authProvider.isLoggedIn()) { 
      console.log('DENY : Redirecting to Login'); 
      event.preventDefault(); 
      $location.path('/login'); 
     } 
     else { 
      console.log('ALLOW'); 
     } 
    }); 
}]) 

然後我們 'authProvider' 服務:

angular.module('myApp') 
    .factory('authProvider', function() { 
    var user; 
     return { 
     setUser : function(aUser){ 
      user = aUser; 
     }, 
     isLoggedIn : function(){ 
      return(user)? user : false; 
     } 
     }; 
    }); 

這種溶液從堆棧溢出的答案here創建。

謝謝@MohammadAwwaad

+0

Thanks @ Rorschach120。那就是訣竅。唯一讓我困惑的是preventDefault()。你甚至需要這個工作嗎?重定向阻止了默認動作和重定向,所以看起來你不喜歡,但我無法看到某些東西。 – sturoid 2014-10-01 17:15:51

+0

+1因爲它重定向到未經授權的用戶的登錄頁面,但如何讓用戶通過服務器端代碼,如PHP登錄?如何在不需要登錄的情況下訪問任何頁面註冊頁面? – 2015-03-02 09:21:35

+3

http://stackoverflow.com/questions/20969835/angularjs-login-and-authentication-in-each-route-and-controller?rq=1 – 2016-07-26 10:07:03

0

我這樣做不同的方式,現在,用Node.js的&快速&的passport模塊,但在此之前,當我使用PHP,我與幾個角模塊做到了。我在我的<html>標記上有一個外部模塊,其中ng-app,然後ng-controller s在某些標記處,如<body> &某些<div> s。在其中一個ng-controller s,我有一個身份驗證功能,然後我有一個ng-if登錄,註銷等。如果用戶沒有登錄,我隱藏當前頁面和ng-included適當的頁面。否則,我在當前頁面上輸入ng-include

這可能不是最好的解決方案,但我不想使用第三方模塊。如果你感到困惑或有任何問題(我知道我很困惑),只是問。

+0

我也做了這樣的事情。在整個事物之外用主控制器中的變量控制可見模板。然後我意識到這正是'ng-view'的作用,所以我試圖用它來代替。 – tscizzle 2016-06-24 04:20:05

相關問題