2012-11-20 23 views
16

我正在尋找一種方法來做這兩件事,首先我想重定向用戶登錄頁面,如果沒有SessionID被發現,第二我想聽聽你的關於只在內存中保留會話ID的意見(沒有cookies)。AngularJS - 重定向到登錄頁面和會話ID的持久性

我想出了重定向的解決方案是:

1 - 創建一個服務名爲OAuth的,將檢查是否SessionID的存在,如果沒有,重定向到登錄頁面,該服務還負責登錄和註銷方法。

app.factory('OAuth', ['$http', function ($http) { 

    var _SessionID = ''; 

    return { 
     login: function() { 
      //Do login ans store sessionID in var _SessionID 
     }, 

     logout: function() { 
      //Do logout 
     }, 

     isLoggedIn: function() { 
      if(_SessionID) { 
       return true; 
      } 
      //redirect to login page if false 
     } 
    }; 

}]); 

2 - 注入每個控制器中新的OAuth服務,並檢查是否用戶isLoggedIn

app.controller('myCtrl', ['$scope', 'OAuth', function ($scope, OAuth) { 

    //check if user is logged 
    OAuth.isLoggedIn(); 

}]); 

問題:

1 - 的isLoggedIn()方法將在所有控制器被調用,所以我想知道是否有辦法做到這一點,而不必注入服務,並在每個控制器中調用它。

2 - 而不是有一個cookie來存儲sessionID我想將它保存在OAuth的_SessionID變量中,並且每個請求都將它發送到服務器。這是一種可行/安全的方法嗎?你能給我一些想法嗎?

謝謝!

回答

8

我會從here開始,Witold創建了這個很酷的攔截器,它可以處理http響應。我使用它,它非常有幫助。

+0

不錯。感謝提示丹! – Bema

+1

[關於該方法的寫作](http://www.espeo.pl/2012/02/26/authentication-in-angularjs-application)也非常有幫助。 –

9

我使用類似的策略(攔截來自服務器的401響應)。您可以檢查出完整的例子在這裏:https://github.com/Khelldar/Angular-Express-Train-Seed

它使用節點和mobgodb在後端的會話存儲和下調該好好嘗試一下重試上面鏈接就像一個丹請求客戶端上的HTTP攔截:

var interceptor = ['$q', '$location', '$rootScope', function ($q, $location, $rootScope) { 
     function success(response) { 
      return response; 
     } 

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

     return function (promise) { 
      return promise.then(success, error); 
     } 
    }]; 
    $httpProvider.responseInterceptors.push(interceptor); 
1

在我的情況,我用

  1. 攔截與$ httpProvider
  2. 配置
  3. 和$窗口依賴ency,因爲$ location只是追加了現有url的路徑。發生了什麼就像「http://www.tnote.me/#/api/auth」,它應該有像「http://www.tnote.me/auth

代碼片段是這樣的。

noteApp = angular.module('noteApp', ['ngRoute', 'ngCookies']) 
    .factory('authInterceptor', ['$rootScope', '$q', '$cookies', '$window', 
    function($rootScope, $q, $cookies, $window) { 
     return { 
     request: function (req) { 
      req.headers = req.headers || {}; 
      if ($cookies.token) { 
      req.headers.Authorization = 'Bearer ' + $cookies.token; 
      } 

      return req; 
     }, 
     responseError: function (rejection) { 
      if (rejection.status == 401) { 
      $window.location = '/auth';  
      } 

      return $q.reject(rejection); 
     } 
     } 
    }]) 
    .config(['$routeProvider', '$httpProvider', function($httpProvider) { 
    $httpProvider.interceptors.push('authInterceptor'); 
    } 
    ]) 
0

這會工作。它在我的應用程序中工作正常

var interceptor = function ($q, $location) { 
     return { 
      request: function (config) {//req 
       console.log(config); 
       return config; 
      }, 

      response: function (result) {//res 
       console.log('Repos:'); 
       console.log(result.status); 
       return result; 
      }, 

      responseError: function (rejection) {//error 
       console.log('Failed with', rejection.status, 'status'); 
       if (rejection.status == 403) { 
        $location.url('/dashboard'); 
       } 

       return $q.reject(rejection); 
      } 
     } 
    }; 
    module.config(function ($httpProvider) { 
     $httpProvider.interceptors.push(interceptor); 
    });