在所有 Angular 个控制器中存储用户信息

Storing user information across all Angular controllers

我创建了一个身份验证控制器,它使用 localstorage 存储经过身份验证的用户信息(我使用的是 Gias Kay Lee 的 ngStorage)。在不同控制器中访问此信息的最佳位置是什么(以 Angular 方式)。我尝试使用服务,代码:

myApp.factory("UserService", ["$localStorage", function ($localStorage) {
    var model = {
        IsAuthenticated: $localStorage.IsAuthenticated,
        Username: $localStorage.UserName
    };
    return model;
}]);

但这(如文档所述)表现为单例。

我也考虑过使用 $rootScope,但据我所知,它只能在 myApp.run 中初始化。我说得对吗?

当然,我可以在每个控制器中注入 ngStorage,但我很好奇如何通过创建自定义全局函数(如上面的服务)来解除对该第三方模块的依赖。

与上述相关的是将用户信息获取到 $scope:

$scope.localStorageToScope = function () {
    $scope.UserName = $localStorage.UserName;
    $scope.UserEmail = $localStorage.UserEmail;
    $scope.UserRole = $localStorage.UserRole;
    $scope.IsAuthenticated = $localStorage.IsAuthenticated;
} 

我只能考虑对每个我当然不想要的控制器重复这段代码。什么是更好的方法?

关于安全性的附注:所有安全的用户操作都在服务器上重新验证,因此当有人破解本地存储机制时不会造成伤害。

基本上有两种方法可以通过应用程序使用身份验证数据。您已经指定的第一种方式,即使用服务,这是个好主意。

$rootScope 应该避免,因为这可能会导致意外行为,因为任何模块都可以在任何地方访问它。因此,第二步可以是通过为单页应用程序创建一个像 BaseController 这样的通用控制器并将其注入到您的 body 标签来模仿这个 $rootScope 概念。

<body ng-controller="BaseController">
    <!-- different pages or views -->
    <div ng-controller="HomePageController" id="home-page"></div>
</body>

现在您可以在 BaseController 范围内存储您的应用程序范围内的通用数据,例如身份验证数据或任何其他数据,这些数据将直接供所有其他控制器范围使用,因为这现在将成为所有控制器的父控制器范围控制器。

第二种方法可能更有用,因为您不必像第一步那样在每个控制器中注入您的服务,您可以只使用 $scope 变量来访问公共控制器中可用的任何数据因为总是使用父范围创建控制器的范围。

希望对您有所帮助!

所以其实你想封装一个第三方服务来减少你对第三方库的依赖。您的第三方库提供了一项服务 $localStorage ,其中包含您要访问的一些属性。这是一种方法:

function YourAuthService($localStorage) {
  this.isAuthenticated = function () {
    return $localStorage.IsAuthenticated;
  }

  this.username = function() {
    return $localStorage.username;
  }
}
myApp.service('YourAuthService', YourAuthService);

这将创建一个可注入包装服务,您可以像这样使用它:

function YourController(YourAuthService) {
  console.log("Current username=" + YourAuthService.username());
  console.log("Current isAuthenticated=" + YourAuthService.isAuthenticated());
}

请注意,您不需要知道身份验证服务如何计算出您查询的数据。您只需调用适当的方法,您的身份验证服务就会完成剩下的工作。这可以很容易地适应其他存储类型。

如果您想用更少的代码创建这样一个简单的包装器,那么(在您的特殊情况下)可以这样做:

function YourAuthService($localStorage) {
  ["isAuthenticated", "username", "furtherProperty", "yadayada"].forEach(function(propertyName) {
    this[propertyName] = function() {
      return $localStorage[propertyName];
    }
  });
}
myApp.service('YourAuthService', YourAuthService);

我相信这就是您要找的。使用 UserService 中的方法重新加载模型数据。教程应该解释一下。

//In app-modules
app.run(['authService', function (authService) {
     authService.fillAuthData();
}]);

//In authService
var _fillAuthData = function () {

    var authData = localStorageService.get('authorizationData');
    if (authData)
    {
        _authentication.isAuth = true;
        _authentication.userName = authData.userName;
    }  
 }

http://www.codeproject.com/Articles/784106/AngularJS-Token-Authentication-using-ASP-NET-Web-A