Angular JS +用户身份验证+页面刷新

时间:2014-09-22 23:57:51

标签: javascript ajax angularjs authentication

所以这是我的问题。

我可以使用与我的pp rest API通信的auth工厂从我的angularJS应用程序成功登录。 让我们说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像这样烦人,你需要放入一个成功的回调函数,让所有代码在成功回调中执行。

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

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

注意:即时通讯使用stateProvider

3 个答案:

答案 0 :(得分: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个例子。

答案 1 :(得分:2)

如果我错了,请纠正我:

在主控制器中执行此操作(确保注入rootScope,state和您自己的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 :(得分:2)

如下所示,在您的登录方法中将logged_in = true放入cookieStore中。

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

并在您的控制器中,执行

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

现在,您可以在UI中的任何位置使用此logged_in变量来检查用户是否已登录。 确保使用' ngCookies'您应用中的模块。并将$ cookieStore依赖项传递给您的控制器。您甚至可以将用户对象本身保持为与cookie中的logged_in变量类似,并从cookie中检索它。 确保执行logged_in = false并清除cookie中的其他变量,并在注销方法中将其设置为空白。