17

我是Angular的新手,現在我只是試圖讓我的所有路線都按照我的意願進行設置和工作。用戶登錄後重定向

設置: 當用戶瀏覽某些網頁(/settings在這個例子中)的應用程序應檢查是否有已經登錄的用戶如果繼續像往常一樣。否則,用戶應該轉到登錄頁面(/login)。

我想什麼: 用戶成功登錄後,在他們應該去他們最初試圖去(/settings

我的問題頁面: 是否有一個「有角度的方式「來記住用戶試圖去的地方?

相關代碼:

app.js

.when('/settings', { 
     templateUrl: '/views/auth/settings.html', 
     controller: 'SettingsCtrl', 
     resolve: { 
     currentUser: function($q, $location, Auth) { 
      var deferred = $q.defer(); 

      var noUser = function() { 
      //remember where the user was trying to go 
      $location.path("/login") 
      }; 

      Auth.checkLogin(function() { 
      if (Auth.currentUser()) { 
       deferred.resolve(Auth.currentUser()); 
      } else { 
       deferred.reject(noUser()); 
      } 
      }); 

      return deferred.promise; 
     } 
     } 
    }) 

login.js

$scope.submit = function() { 
    if(!$scope.logInForm.$invalid) { 
     Auth.login($scope.login, $scope.password, $scope.remember_me) 
     //go to the page the user was trying to get to 
    } 
    }; 

許多感謝約翰·林德奎斯特爲the video這讓我這麼遠。

+1

您可以將此信息存儲在$ rootScope中或存儲在[service](http://docs.angularjs.org/guide/dev_guide.services)中。 – 2013-03-07 01:24:19

回答

17

首先,您不想將用戶重定向到登錄頁面。在單個頁面的Web應用程序

一個理想的流程如下:

  1. 用戶訪問一個網站。該網站在特定路線(例如/ profile/edit)下回復 角度應用的靜態資產。

  2. 控制器(對於給定路由)使用$ http,$ route或其他機制調用API(例如,通過GET方法預先填寫編輯配置文件表單,其中包含登錄用戶帳戶中的詳細信息to/api/v1/users/profile)

  3. 如果/當客戶端從API接收401,顯示登錄模式爲 ,並重播API調用。

  4. 的API調用成功(在這種情況下,用戶可以查看自己的帳戶預填充編輯個人資料表格。)

你怎麼能做到#3?答案是$ http 響應攔截器

對於全局錯誤處理,驗證或任何形式接收到的響應的 同步或異步預處理的目的,是 希望能夠攔截HTTP請求的響應 他們被移交給應用程序代碼前發起這些 請求。 響應攔截器利用承諾API 滿足同步和異步預處理的這種需求。

http://docs.angularjs.org/api/ng.$http

現在我們知道了理想的用戶體驗應該是什麼,我們該怎麼做呢?

這裏有一個例子:http://witoldsz.github.com/angular-http-auth/

的例子是基於這篇文章:

http://www.espeo.pl/2012/02/26/authentication-in-angularjs-application

好運和快樂Angularing!

+2

我不同意你關於「不想重定向」的陳述。我使用http攔截器捕獲401和顯示登錄模式。它有一個嚴重的問題,我的客戶端不會接受 - 失敗的頁面上有應用程序的可見部分 - ng-view呈現,但組件是空的cos從401請求資源API。但是頁面(界面)對於完全沒有特權的訪問者也是可見的。 – srigi 2013-09-30 10:47:39