如何保持全球当前用户直到angular_devise注销? [英] How to keep globally current user until logout with angular_devise?

查看:125
本文介绍了如何保持全球当前用户直到angular_devise注销?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何建立自己的服务访问全球将由呼叫服务器的currentUser()仅在页面加载一次,如果用户登录,然后把它和数据提供给控制器或状态,直到注销?
现在我解决很多次在许多国家或控制器的currentUser(),我发现文档:的 authparseresponse 的,这是可能,使自己的服务,但我不知道如何在正确的方式处理这个问题。

How to create own service accessible globally that will call server by currentUser() only once on page load, if User is logged in then keep it and provide data to controllers or states until logout? Now I'm resolving many times in many states or controllers currentUser(), I found in docs: authparseresponse that it is possibility to make own service, but I don't know how to handle this in right way.

例如在UI路由器我有2服务器调用,便足以被载入页面,只有当:

e.g in ui-router I've two server calls, would be sufficient only when page is loaded:

.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
      });
    }
  ]
})

或NavController每次下一个服务器的呼叫:

or each time next server call in 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");
    });
  }
]);

我发现类似的问题不回答:<一href=\"http://stackoverflow.com/questions/29074185/how-to-globally-implement-authentication-with-angularjs-devise-and-ui-router\">stackoverflow

推荐答案

正如我们所知道的工厂是一个单独的对象,主要是用于数据共享。我们可以将其注入到任何控制器,并起到依赖
这。所以也可以解决你的问题。该注入的服务,你的国家的决心块,并检查用户是否存在与否如果没有则调用该工厂获取用户的功​​能

As we know factory is a singleton object and basically it is used for data sharing. We can inject it to any controller and functions as an dependency .So this may be also solve your problem. inject this service to your state resolve block and check if user exists or not if not then call the fetch user function of factory

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;
    }
}

});

和你的国家配置块的样子。

and your state config block is look like

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

这篇关于如何保持全球当前用户直到angular_devise注销?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆