通过身份验证和页面刷新获取AngularJS中的用户数据

时间:2015-12-02 14:59:57

标签: angularjs authentication

我已经制作了一个AuthService,可以帮助我处理所有身份验证问题,例如登录,注册,从服务器获取用户数据等。

我正在寻找一种只能在登录,页面刷新和触发刷新时运行的解决方案,从服务中获取用户数据并使其在包含服务的控制器上可用。我希望有类似vm.user = AuthService.getUserData()的东西,这将从服务返回会话变量。像这样:

function getUserData(){
    if (session) {
        return session.user;
    }
    return null;
}

On $ 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()上设置超时,因为当执行此操作时,从服务器检索会话数据的调用尚未完成,但这是一种不好的做法。 / p>

以下是完整的服务代码http://pastebin.com/QpHrKJmb

2 个答案:

答案 0 :(得分:2)

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

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

.state('bla', {
    template: '...'
    controller: 'BlaCtrl',
    resolve: {
        user: ['AuthService', function(AuthService) {
            return AuthService.loadSessionData();
        }
    }
}

另外,改变你的loadSessionData函数:(确保将$ q注入 AuthService

function loadSessionData() {

    return $q(function(resolve, reject) {
        $http({
            url: API.URL + 'auth/session-data',
            method: 'GET'
        })
        .success(function(response)
        {
            if (response) {
                resolve(response);            
            } else {
                reject();
            }
        })
        .error(function(err){
            reject(err);
        });
    })
}

最后,将解析函数中的 user 对象添加到控制器:


    app.contoller('BlaCtrl', ['$scope', 'user', function($scope, user) {
        $scope.user = user;
    }]);

这取得了什么成果?

  1. 如果用户没有有效会话或发生错误,则拒绝状态更改并抛出事件 $ stateChangeError 。您可以收听(就像您为 $ stateChangeStart 为该事件所做的那样,并使用模式进行响应,重定向到错误页面等等。

  2. 您只需为需要它的州提取会话 - 而不是针对每个州的变化。

  3. 在解析用户数据(通过解决或拒绝)之前,状态不会得到解决。

答案 1 :(得分:0)

您应该在getUserData()

中调用loadSessionData()
function getUserData(){
   loadSessionData()
   .success(function(response)
    {
       if (response) {
         return response.user;
       }
    })
    return null;
 }

function loadSessionData() {
   return $http.get(API.URL+'auth/session-data');
};