2013-07-31 30 views
22

現在,我正在基於Ruby on Rails構建基於AngularJS的應用程序,並使用Devise進行身份驗證。當用戶認證成功並且身份驗證失敗時,服務器響應正常。我想我的問題是,使用$ cookieStore,知道用戶是否登錄的最佳做法是什麼?有一個由Rails設置的名爲「myapp_session」的cookie,但該會話並不一定意味着用戶已登錄。尋找有關如何使用AngularJS保持用戶在線/離線管理的想法。不管解決方案如何,我仍然會確保需要授權的請求獲得後端的授權。確保用戶使用cookieStore和AngularJS登錄或註銷的最佳實踐

回答

37

您可以創建一個指令,在應用程序加載時設置記錄的用戶,例如請求服務器上的當前用戶會話。

angular.module('Auth', [ 
     'ngCookies' 
    ]) 
    .factory('Auth', ['$cookieStore', function ($cookieStore) { 

     var _user = {}; 

     return { 

      user : _user, 

      set: function (_user) { 
       // you can retrive a user setted from another page, like login sucessful page. 
       existing_cookie_user = $cookieStore.get('current.user'); 
       _user = _user || existing_cookie_user; 
       $cookieStore.put('current.user', _user); 
      }, 

      remove: function() { 
       $cookieStore.remove('current.user', _user); 
      } 
     }; 
    }]) 
; 

而在你run方法設置AppController

.run(['Auth', 'UserRestService', function run(Auth, UserRestService) { 

      var _user = UserRestService.requestCurrentUser(); 
      Auth.set(_user); 
     }]) 

當然,如果到服務器的任何請求返回Http Status 401 - Unauthorized,你需要調用Auth.remove()服務從餅乾刪除用戶和重定向用戶登錄頁面。

我使用這種方法,效果很好。您也可以使用localStorage,但用戶數據將會持續很長時間。除非您爲此身份驗證設置了到期日期,否則我並不認爲這是最佳做法。

記住總是驗證您的服務器站點的用戶憑據=)

[編輯]

要收聽401 - Unauthorized服務器響應,你可以把一個攔截器,在您的$http要求,如這樣的:

.config(['$urlRouterProvider', '$routeProvider', '$locationProvider', '$httpProvider', function ($urlRouterProvider, $routeProvider, $locationProvider, $httpProvider) { 
     $urlRouterProvider.otherwise('/home'); 
     var interceptor = ['$location', '$q', function ($location, $q) { 

      function success(response) { 
       return response; 
      } 

      function error(response) { 

       if (response.status === 401) { 
        $location.path('/login'); 
        return $q.reject(response); 
       } 
       else { 
        return $q.reject(response); 
       } 
      } 

      return function (promise) { 
       return promise.then(success, error); 
      }; 
     }]; 

     $httpProvider.responseInterceptors.push(interceptor); 
    }]) 

401響應每一個電話,用戶會被重定向在/login PA到登錄頁面日。

你會發現一個很好的例子here

+1

這是一個夢幻般的迴應。感謝您的洞察力。這很有用。 –

+1

我得到一個關於'未知的提供者:$ urlRouterProvider'的錯誤。 –

+0

你使用angular v1.2嗎? –

4

您可以

$cookieStore.put('logged-in', some_value) 

設置Cookie在你登錄的回調然後檢查時,他們與

.run(function($cookieStore) { 
    if ($cookieStore.get('logged-in') === some_value) { 
     let him enter 
    } 
    else { 
     you shall not pass 
    } 
}); 

有進入您的網站可能會更「正確」的方式,但這是有效的。

2

如果您在通過接受的答案工作中的問題,要警惕,隨着角1.3,添加新的攔截器的正確方法是將其添加到$ httpProvider.interceptors,所以不是:

$httpProvider.responseInterceptors.push(interceptor); 

使用:

$httpProvider.interceptors.push(interceptor);