如何在使用angular_devise注销之前保持全局当前用户?

luz*_*zny 19 javascript devise angularjs angular-services angular-ui-router

如何创建全局可访问的服务,currentUser()只在页面加载时调用服务器一次,如果用户登录然后保留它并向控制器或状态提供数据直到注销?现在我在许多州或控制器中解决了很多次currentUser(),我在docs中发现:authparseresponse它可以自己做服务,但我不知道如何以正确的方式处理这个问题.

例如在ui-router中我有两个服务器调用,只有在加载页面时才足够:

.state('login', {
  url: '/login',
  templateUrl: 'auth/_login.html',
  controller: 'AuthCtrl',
  onEnter: [
    '$state', 'Auth',
    function($state, Auth) {
      Auth.currentUser().then(function() {
        $state.go('home');
      });
    }
  ]
})
.state('dashboard', {
  url: '/dashboard',
  templateUrl: 'dashboard.html',
  onEnter: [
    '$state', 'Auth',
    function($state, Auth) {
      Auth.currentUser().then(function(user) {}, function(err) {
        $state.go('home');// user not logged in
      });
    }
  ]
})
Run Code Online (Sandbox Code Playgroud)

或者每次在NavController中调用下一个服务器:

app.controller('NavController', [
  '$state', '$scope', 'Auth', function($state, $scope, Auth) {
    $scope.signedIn = Auth.isAuthenticated;
    $scope.logout = Auth.logout; // logout function
    Auth.currentUser().then(function(user) {
      $scope.user = user;
    });
    $scope.$on('devise:login', function(e, user) {
      $scope.user = user;
    });
    $scope.$on('devise:logout', function(e, user) {
      $scope.user = {};
      $state.go("home");
    });
  }
]);
Run Code Online (Sandbox Code Playgroud)

我找到了类似的问题,没有回答:stackoverflow

Bha*_*han 11

我们知道工厂是一个单独的对象,基本上它用于数据共享.我们可以将它注入任何控制器并作为依赖项运行.这也可以解决您的问题.将此服务注入到您的状态解析块并检查用户是否存在,如果没有,则调用工厂的获取用户功能

app.factory("User", function($http, $q, $rootScope) {
var user = null;
return {
    fetchUser: function() {
        /*your ajax call that return current user*/
        user = YOUR_SERVER_RESPONSE;
        return user;

    },
    getUser : function(){
        return user;
    },
    setUser : function(u){
        user = u;
    }
}
Run Code Online (Sandbox Code Playgroud)

});

你的状态配置块看起来像

  .state('dashboard', {
  url: '/dashboard',
  templateUrl: 'dashboard.html',
  resolve : function(User){
    if(User.getUser()){
        return User.getUser();
    }else{
        return User.fetchUser();
    }
  }
})
Run Code Online (Sandbox Code Playgroud)


zay*_*uan 8

我必须在一个大型Angular应用程序中处理用户身份验证,并发现这篇文章非常有用:https://medium.com/opinionated-angularjs/techniques-for-authentication-in-angularjs-applications-7bbf0346acec

具体到'如何让它只发生一次':

  • 你可以在app.run块中调用服务的init()
  • 将其添加resolve为应用程序的外部状态的要求(如果使用嵌套状态)

一个UserService服务代表用户的登录状态非常适用于在整个应用程序共享状态.登录和注销功能可以通过此服务公开,用户的详细信息也可以存储在此处.定义UserApi扩展$resource可能有助于将实际的HTTP问题与管理用户状态分开.

其他可能会引起您注意的问题,这两个问题都包含在本文中:跨页面刷新的持久状态,以及只有在用户登录时才能访问的站点区域.