在身份验证和页面刷新时以AngularJS获取用户数据

在身份验证和页面刷新时以AngularJS获取用户数据,angularjs,authentication,Angularjs,Authentication,我制作了一个AuthService,它可以帮助我处理所有的身份验证事务,比如登录、注册、从服务器获取用户数据等等 我正在寻找一个解决方案,它只在登录、页面刷新和触发刷新时运行,从服务获取用户数据,并使其在我包含服务的控制器上可用。我想要类似于vm.user=AuthService.getUserData()的东西,它从服务返回会话变量。大概是这样的: function getUserData(){ if (session) { return session.user;

我制作了一个AuthService,它可以帮助我处理所有的身份验证事务,比如登录、注册、从服务器获取用户数据等等

我正在寻找一个解决方案,它只在登录、页面刷新和触发刷新时运行,从服务获取用户数据,并使其在我包含服务的控制器上可用。我想要类似于vm.user=AuthService.getUserData()的东西,它从服务返回会话变量。大概是这样的:

function getUserData(){
    if (session) {
        return session.user;
    }
    return null;
}
在$rootScope上。$On(“$stateChangeStart”)我有:

AuthService.loadSessionData();
也就是说:

function loadSessionData() {
    $http({
            url: API.URL+'auth/session-data',
            method: 'GET'
        })
    .success(function(response)
    {
        session = response;
    })
    .error(function(err){
        console.log(err);
    });
};
这里的一个问题是,我必须在AuthService.getUserData()上设置超时,因为当执行此操作时,从服务器检索会话数据的调用尚未完成,但这是一种不好的做法


这是完整的维修代码

使用resolve如何?如果我理解正确,您希望在控制器中保留此数据

您可以将其添加到状态定义中:

.state('bla', { template: '...' controller: 'BlaCtrl', resolve: { user: ['AuthService', function(AuthService) { return AuthService.loadSessionData(); } } } .州('bla'{ 模板:“…” 控制器:“BlaCtrl”, 决心:{ 用户:['AuthService',函数(AuthService){ 返回AuthService.loadSessionData(); } } } 另外,更改loadSessionData函数:(确保将$q注入AuthService)

函数loadSessionData(){ 返回$q(函数(解析、拒绝){ $http({ url:API.url+'auth/session data', 方法:“获取” }) .成功(功能(响应) { 如果(答复){ 决心(回应); }否则{ 拒绝(); } }) .error(函数(err){ 拒绝(错误); }); }) } 最后,将resolve函数中的用户对象添加到控制器:

app.contoller('BlaCtrl', ['$scope', 'user', function($scope, user) { $scope.user = user; }]); app.contoller('BlaCtrl',['$scope','user',function($scope,user){ $scope.user=用户; }]); 这能实现什么

  • 如果用户没有有效会话或发生错误,则状态更改将被拒绝,并引发事件$stateChangeError。您可以侦听(就像您对$stateChangeStart所做的那样)该事件,并使用模式、重定向到错误页或其他方式进行响应

  • 您只为需要它的状态拉会话,而不是为每个状态更改拉会话

  • 直到用户数据也被解析(通过解析或拒绝),状态才会被解析


  • 您应该在getUserData()中调用loadSessionData()


    我的方法也差不多,因为vm.user=AuthService.getUserData()不等待调用终止,它是异步的,并且vm.user的最终值是未定义的,这是实现该技巧的原因。我要补充的是,我已使用resolve创建了一个抽象状态:{Session:…}因此,我将在从应用派生的每个状态上提供会话。另一个好的调整是,在loadSessionData上,我在开始时检查会话变量是否存在,以便它不再获取数据。我实际上想说的是,您可以更改我编写的内容以使用缓存:)使用根状态时,如果在子状态之间切换,则只解析子状态,而不是父状态。请记住这一点,这样您就不会有一个根状态只解析会话一次,并假定会话从此点起有效。但是,这取决于您不想在应用程序中使用会话的方式此会话不可用实际上,会话是此会话上的用户数据。这保持不变,直到用户更改其配置文件中的某些内容,然后我强制更新它。会话由JWT令牌保留,因此它是分开的。 app.contoller('BlaCtrl', ['$scope', 'user', function($scope, user) { $scope.user = user; }]);
    function getUserData(){
       loadSessionData()
       .success(function(response)
        {
           if (response) {
             return response.user;
           }
        })
        return null;
     }
    
    function loadSessionData() {
       return $http.get(API.URL+'auth/session-data');
    };