2014-09-22 94 views
3

所以这是我的问题。Angular JS +用户认证+页面刷新

我可以使用auth工厂成功地从我的angularJS应用程序登录,我通过它与我的pp rest API进行通信。 可以说Auth.login(用户) - >(POST)myapi.com/user/login:响应是Auth在本地保存的用户对象。因此Auth.getCurrentUser()返回本地用户对象。

我的其他API,我也有一个myapi.com/user/get_loggedin_user它返回当前登录的用户(使用PHP会话)。因此,如果Auth.getCurrentUser应该实际检查本地用户是否存在,如果不是,请对myapi.com/user/get_loggedin_user执行ajax并检查是否在使用null响应之前登录。这里的一个问题是,ajax很烦人,你需要放入一个成功的回调函数,并让所有代码在成功回调中执行。

现在让我们在Angular App(网站),mydomain.com/user/dashboard(已经登录)上说im,然后我刷新我的浏览器。现在,当页面重新加载时,angular不知道我当前的用户,所以在它将它重定向到mydomain/login之前,我希望它检查用户是否已登录。我可以明显在控制器中进行一次1次调用,但有没有更简单的方法,我可以在控制器中注册一些访问限制(例如:logged_in == true),并且当您访问任何具有登录需求的页面时,它会检查本地用户(如果用户不存在,则获取用户) ,如果为空则重定向到登录页面,或者一旦匹配需求就显示页面?

不同的常见页面要求:null,logged_in,admin,function:haveAccess(user,object)。

注意:在使用stateProvider

IM

回答

4

如果我正确理解你的问题,你正在询问如何在调用控制器之前检查用户是否在之前登录,并且为了避免检查登录状态在每个需要它的控制器中。

如果是这样,你应该看看resolve参数 - 这存在于$routerProvider$stateProvide

从本质上讲,你可以“解决”您loggedInUser变数(做任何你需要通过你的MyAuth服务做

这里是什么,我有$ routeProvider意味着一个例子:

$routeProvider 
    .when("/someSecuredContent", { 
    templateUrl: 'someSecuredContent.html', 
    controller: 'SecuredController', 
    resolve: { 
     loggedInUser: function(MyAuth){ 
      return MyAuth.loggedIn(); // MyAuth.loggedIn() should return a $q promise 
     } 
    } 
}); 

然后在控制器,loggedInUser将被注入。

这里有一个site有更多的例子。

+0

这是伟大的(测试和工作很好)。但是我有2个问题。 1.需要身份验证层(用户必须登录)的每个状态/子状态,我需要复制粘贴这个重新编码的代码块(它很简单,但似乎有点重复,必须是更好的方法?) 。但这很好,它的工作原理,并没有什么大不了的,如果我需要复制粘贴几行代码。 2.有没有办法在全球各地都有这种触发器?这是因为我可以触发MyAuth.getInfo()或MyAPI.getInfo()来获取应用程序的初始信息(主要是第一次用户进入刷新页面)。 – decay 2014-09-24 06:38:03

+0

如果你想加载控制器(及其安全先决条件)的方式,你应该阅读这个有用的[post](http://weblogs.asp.net/dwahlin/dynamically-loading-controllers-and-views- with-angularjs-and-requirejs),特别是在routeResolver.js文件的结尾部分。 – 2014-09-24 07:37:35

+0

@decay,我回答你的问题吗? – 2014-09-25 16:04:59

2

纠正我,如果我错了:

做这个主控制器内(确保你注入喜欢rootScope,状态,和你自己的Authfactory的依赖关系)

$rootScope.$on('$stateChangeStart', function (event, next, toParams) { 
     if (needToBeLoggedIn()) { //use the next object to read any data, and you can set on the state some flag 
      event.preventDefault() 
      MyAuth.loggedIn(function success(){ $state.go(next,toParams); }, function err(){/*send somewhere else*/}); 
     } 
    }) 
2

如下所示,在登录方法中将logged_in = true置于cookieStore中。

$cookieStore.put('logged_in',true); 
$rootScope.logged_in = true; 

,并在你的控制器,也

$rootScope.logged_in = $cookieStore.get('logged_in'); 

现在你可以在任何地方使用这个LOGGED_IN变量在用户界面检查用户是否登录。 请务必使用“ngCookies”模块中你的应用。并将$ cookieStore依赖关系传递给您的控制器。您甚至可以将用户对象本身与cookies中的logged_in变量保持类似,并从Cookie中检索它。 确保执行logged_in = false并清除Cookie中的其他变量,并将其设置为在注销方法中为空。