AngularJS에 현재 사용자 컨텍스트를 어떻게 저장합니까?


92

사용자를 로그인하는 AuthService가 있으며 사용자 json 개체를 반환합니다. 내가 원하는 것은 해당 개체를 설정하고 페이지를 새로 고칠 필요없이 모든 변경 사항이 응용 프로그램 (로그인 / 로그 아웃 상태)에 반영되도록하는 것입니다.

AngularJS로 어떻게이 작업을 수행 할 수 있습니까?

답변:


180

이를 수행하는 가장 쉬운 방법은 서비스를 사용하는 것입니다. 예를 들면 :

app.factory( 'AuthService', function() {
  var currentUser;

  return {
    login: function() { ... },
    logout: function() { ... },
    isLoggedIn: function() { ... },
    currentUser: function() { return currentUser; }
    ...
  };
});

그런 다음 컨트롤러에서이를 참조 할 수 있습니다. 다음 코드는 지정된 함수를 호출하여 서비스에서 값의 변경 사항을 감시 한 다음 변경된 값을 범위에 동기화합니다.

app.controller( 'MainCtrl', function( $scope, AuthService ) {
  $scope.$watch( AuthService.isLoggedIn, function ( isLoggedIn ) {
    $scope.isLoggedIn = isLoggedIn;
    $scope.currentUser = AuthService.currentUser();
  });
});

그리고 물론 적절하다고 생각되는 정보를 사용할 수 있습니다. 예를 들어 지시문, 템플릿 등에서이 작업을 메뉴 컨트롤러 등에서 반복 할 수 있습니다 (필요한 작업에 맞게 사용자 지정). 서비스의 상태를 변경하면 모두 자동으로 업데이트됩니다.

더 구체적인 것은 구현에 따라 다릅니다.

도움이 되었기를 바랍니다!


28
@ChrisNicola 실제로 AngularJS에서 모든 서비스는 싱글 톤입니다. 따라서 서비스는 처음 요청 될 때 (예 : 컨트롤러 또는 다른 서비스에 의해) 생성되고 이에 대한 모든 후속 요청은 똑같은 인스턴스를 반환합니다.
Josh David Miller

2
그럴 수도 있지만 함수로서 공용 API 및 개인 API에서 해당 정보를 저장하는 방법의 내부를 제거 할 수 있습니다. 이렇게하면 나중에 리팩토링이 훨씬 쉬워집니다. 그러나 함수는 여전히 부울을 반환 합니다.
Josh David Miller

7
이것은 어리석은 질문 일 수 있지만 사용자가 페이지를 새로 고치면 어떻게됩니까? 로그인 정보가 손실됩니까?
Tomba

10
@Tomba 좋은 질문입니다. :-) 실제로 정보는 새로 고침시 손실됩니다. 일반적으로 일부 세션 정보를 쿠키에 저장하고 싶을 것 입니다. 해당 세션 정보는 AuthService. 이는 페이지 새로 고침뿐만 아니라 새 탭에서 링크를 여는 사람에게도 도움이됩니다.
Josh David Miller

2
@PixMach 학습 곡선에 대해 100 % 맞습니다. 귀하의 질문은 많은 특정 경우에 따라 다르지만 여기에는 몇 가지 일반적인 패턴이 있습니다. 우려 사항을 분리하십시오. 로그인 시작과 관련된 UI는 인증 자체와 별개이며, 인증 상태와는 별개이며, 해당 상태에 의존 할 수있는 메뉴와는 별개입니다. 탐색 / 메뉴는 단일 컨트롤러에서 가장 잘 처리되는 경우가 많으며 중첩 상태 (a la ui-router) 및 경로 확인은 인증 컨트롤을 DRY로 유지하는 좋은 방법입니다. 당신이 쓴 내용은 옳다고 들립니다.
Josh David Miller

5

AuthService는 일반적으로 누구에게나 관심이 있기 때문에 (예를 들어, 아무도 로그인하지 않으면 로그인보기가 사라져야 함), 더 간단한 대안은 $rootScope.$broadcast('loginStatusChanged', isLoggedIn);(1 ) (2), 이해 당사자 (예 : 컨트롤러)는 $scope.$on('loginStatusChanged', function (event, isLoggedIn) { $scope.isLoggedIn = isLoggedIn; }.

(1) $rootScope서비스의 인수로 주입 됨

(2) 비동기 로그인 작업의 경우, $rootScope.$apply()함수 에 포함하여 브로드 캐스트가 변경 될 것이라는 것을 Angular에 알리고 싶을 것 입니다.

이제 모든 / 다수의 컨트롤러에서 사용자 컨텍스트를 유지하는 것에 대해 말하면, 모든 사람의 로그인 변경 사항을 듣지 않을 수 있으며 최상위 로그인 컨트롤러에서만 수신 한 다음 다른 로그인 인식 컨트롤러를 자식으로 추가하는 것을 선호 할 수 있습니다. 이것의 임베디드 컨트롤러. 이렇게하면 자식 컨트롤러가 사용자 컨텍스트와 같은 상속 된 부모 $ scope 속성을 볼 수 있습니다.


4
공장 기능에 대한 잘못된 설명으로 찬성했습니다. 이 오해는 답변을 게시하기 몇 달 전에 이미이 댓글 에서 해결되었습니다 .
Rhys van der Waerden 2014
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.