如何在AngularJS中处理$ rootscope并获取登录用户的用户ID?

时间:2016-09-25 09:14:03

标签: angularjs authentication authorization

我想找到登录用户的ID并将其显示在页面中。我是角色的新手,我对如何处理会话没有太多线索..

我有一个角度应用程序,它连接到后端API(.net核心)。

我将展示在网站中使用$ rootScope的实例(已启用登录和授权)。我需要了解这一点才能学习应用程序。

在App.js中:

//Run phase
myApp.run(function($rootScope, $state) {
    $rootScope.$state = $state; //Get state info in view

    //Should below code be using rootScope or localStorage.. Check which one is better and why.

    if (window.sessionStorage["userInfo"]) {

        $rootScope.userInfo = JSON.parse(window.sessionStorage["userInfo"]);
    }

    //Check session and redirect to specific page
    $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams){
        if(toState && toState.data && toState.data.auth && !window.sessionStorage["userInfo"]){
            event.preventDefault();
            window.location.href = "#login";
        }       

        if(!toState && !toState.data && !toState.data.auth && window.sessionStorage["userInfo"]){
            event.preventDefault();
            window.location.href = "#dashboard";
        }
    });


});

Users.js:

'use strict';
angular.module('users', []);

//Routers
myApp.config(function($stateProvider) {

  //Login
  $stateProvider.state('login', {
    url: "/login",
    templateUrl: 'partials/users/login.html',
    controller: 'loginController'
  });
//Factories
myApp.factory('userServices', ['$http', function($http) {

    var factoryDefinitions = {
        login: function (loginReq) {
            $http.defaults.headers.common['Access-Control-Allow-Origin'] = '*';
          return $http.post('http://localhost:1783/api/token?UserName='+loginReq.username+'&password='+loginReq.password).success(function (data) { return data; });
      }
}

    return factoryDefinitions;
  }
]);

//Controllers
myApp.controller('loginController', ['$scope', 'userServices', '$location', '$rootScope', function($scope, userServices, $location, $rootScope) {

    $scope.doLogin = function() {

        if ($scope.loginForm.$valid) {  
            userServices.login($scope.login).then(function(result){
                $scope.data = result;
                if (!result.error) {
                    window.sessionStorage["userInfo"] = JSON.stringify(result.data);
                    $rootScope.userInfo = JSON.parse(window.sessionStorage["userInfo"]);
                    //$localStorage.currentUser = { username: login.username, token: result.data };
                    //$http.defaults.headers.common.Authorization = 'Token ' + response.token;
                    $location.path("/dashboard");
                }
            }); 
        }
    };
}]);

我开始知道有关用户的信息将在$ rootScope.userInfo中提供。如果是这样,我如何在其中取值?

如果可能,请举例说明。提前谢谢。

2 个答案:

答案 0 :(得分:2)

一:

myApp.controller('loginController', [
'$scope', 'userServices', '$location', 
'$rootScope', 
function($scope, userServices, $location, $rootScope) {

在控制器内部注入了$rootScope,这使您可以访问该控制器中的userInfo

因此,如果您将$rootScope注入另一个控制器并console.log($rootScope.userInfo),您会看到用户数据。

myApp.controller('anotherController', ['$scope', '$rootScope', function
 ($scope, $rootScope){

    console.log($rootScope.userInfo) //you'd see the users data from sessionStorage

});

根据quora上的这篇文章

  

$ scope是可从当前组件访问的对象       例如控制器,仅限服务。 $ rootScope引用一个对象       可以从应用程序的任何地方访问。       您可以将$ rootScope视为全局变量,将$ scope视为局部变量。

$rootScope Defn.

答案 1 :(得分:1)

在您的情况下,一旦用户登录了密钥" userInfo"在sessionStorage中创建并将相同的数据复制到$ rootScope.userInfo。要在登录后检查userInfo中的字段,请尝试

console.log($rootScope.userInfo);

并在控制台中打印或在浏览器调试工具[打开Chrome开发工具>应用程序> sessionstorage> domainname]中打开会话存储,以查看" userInfo"键。

假设你有

{
    uid: "10",
    fullname: "John Doe"
}

您可以使用$ rootScope.userInfo.uid或$ rootScope.userInfo [' uid']访问脚本中的uid。

万一你无法阅读代码,这里有一个解释

if (window.sessionStorage["userInfo"]) {

    $rootScope.userInfo = JSON.parse(window.sessionStorage["userInfo"]);
}

正在检查用户是否已登录。

工厂

myApp.factory('userServices', ['$http', function($http) {

var factoryDefinitions = {
    login: function (loginReq) {
        $http.defaults.headers.common['Access-Control-Allow-Origin'] = '*';
      return $http.post('http://localhost:1783/api/token?UserName='+loginReq.username+'&password='+loginReq.password).success(function (data) { return data; });
  }
}

正在调用服务器来获取userInfo对象。

$scope.doLogin = function() {

    if ($scope.loginForm.$valid) {  
        userServices.login($scope.login).then(function(result){
            $scope.data = result;
            if (!result.error) {
                window.sessionStorage["userInfo"] = JSON.stringify(result.data);
                $rootScope.userInfo = JSON.parse(window.sessionStorage["userInfo"]);
                //$localStorage.currentUser = { username: login.username, token: result.data };
                //$http.defaults.headers.common.Authorization = 'Token ' + response.token;
                $location.path("/dashboard");
            }
        }); 
    }
};

$ scope.doLogin正在调用上面的工厂并存储userInfo对象。