2013-07-31 1 views
22

지금 당장 Ruby on Rails 위에 AngulesJS 기반 응용 프로그램을 만들고 인증을 위해 Devise를 사용하고 있습니다. 나는 사용자가 성공적으로 인증을 받았을 때와 인증이 실패 할 때 서버가 적절하게 응답하도록했습니다. 제 질문은 $ cookieStore를 사용하여 사용자가 로그인했는지 여부를 알 수있는 가장 좋은 방법이라고 생각하십니까? Rails가 "myapp_session"이라고 설정 한 쿠키가 있지만 세션이 반드시 사용자가 로그인했다는 것을 의미하지는 않습니다. 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 요청 인터셉터를 넣을 수 있습니다처럼) = 서버 사이트에 사용자 자격 증명을 확인 항상에 유의하십시오 이 :

401 응답 모든 호출, 사용자가 /login 연평균 로그인 페이지로 리디렉션됩니다
.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); 
    }]) 

th.

당신은 그들이이

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

로 사이트를 입력하면 그 다음을 확인 당신은

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

으로 로그인 콜백에 쿠키를 설정할 수 있습니다 here

+1

이 환상적인 반응이다. 통찰력에 감사드립니다. 유용했습니다. –

+1

'Unknown provider : $ urlRouterProvider'에 대한 오류가 있습니다. –

+0

각도 버전 1.2를 사용하고 있습니까? –

4

좋은 예를 찾을 수 더 정확한 "방법일지도 모르지만, 이것은 작동합니다.

2

당신이 허용 대답 업무를하는 데 문제가 있다면, 각도 1.3으로, 새로운 인터셉터를 추가하는 적절한 방법은 $ httpProvider.interceptors에 추가하여 것을,주의, 그래서 대신 :

$httpProvider.responseInterceptors.push(interceptor); 

사용 :

$httpProvider.interceptors.push(interceptor); 
관련 문제