用AngularJS和ui路由器实现身份验证

用AngularJS和ui路由器实现身份验证,angularjs,authentication,angular-ui-router,Angularjs,Authentication,Angular Ui Router,我正在尝试使用ui路由器和angularJS处理身份验证,我希望实现以下正常场景: 如果(用户未通过身份验证&&状态需要身份验证),则 转到“登录”状态 否则,如果(用户已通过身份验证&&状态不需要身份验证),则 转到“主”状态 否则将转到用户请求的状态 我以一种我不确定是否正确的方式实现了它,我需要你们的一些验证 我有一个resolve函数,用于从服务器检索用户是否经过身份验证的信息,如果被拒绝,则我将用户发送到$stateChangeError中的“登录”状态。如果问题解决了,我将处理$

我正在尝试使用ui路由器和angularJS处理身份验证,我希望实现以下正常场景:

  • 如果(用户未通过身份验证&&状态需要身份验证),则 转到“登录”状态
  • 否则,如果(用户已通过身份验证&&状态不需要身份验证),则
    转到“主”状态
  • 否则将转到用户请求的状态
我以一种我不确定是否正确的方式实现了它,我需要你们的一些验证

我有一个resolve函数,用于从服务器检索用户是否经过身份验证的信息,如果被拒绝,则我将用户发送到$stateChangeError中的“登录”状态。如果问题解决了,我将处理$stateChangeSucture中的其他逻辑

但据我所知,信息仅在$stateChangeSuccess中可用,而在$stateChangeStart中不可用,因此,如果我在$stateChangeSuccess中实现了我在上面写的逻辑,那么在转换结束之前,一些页面将闪烁

请告知。是否有其他方法或方法来改进此解决方案?。我考虑为每个状态创建一个解析函数,检查用户是否经过身份验证,并在那里进行路由


谢谢。

这是单页应用程序的问题。我在angular页面中使用的解决方案之一是缓存用户ID和用户在本地存储中经过身份验证的事实。您也可以将到期日添加到该列表中。这里有一个指向本地存储模块的链接:(还有其他的)

然后在每个状态下,您都可以检查用户是否已经过身份验证,而不是每次都返回服务器。此外,这将有助于后退/前进按钮更好地工作。通常,在控制器中,您会有代码来检查用户是否经过身份验证(这可能会检查本地存储中的标志,并获取最初从服务器检索到的userinfo)

但是,如果浏览器由多个用户共享,我可以看到一些安全问题


这篇文章似乎列出了一种更好/更新的方法:

这是单页应用程序的问题。我在angular页面中使用的解决方案之一是缓存用户ID和用户在本地存储中经过身份验证的事实。您也可以将到期日添加到该列表中。这里有一个指向本地存储模块的链接:(还有其他的)

然后在每个状态下,您都可以检查用户是否已经过身份验证,而不是每次都返回服务器。此外,这将有助于后退/前进按钮更好地工作。通常,在控制器中,您会有代码来检查用户是否经过身份验证(这可能会检查本地存储中的标志,并获取最初从服务器检索到的userinfo)

但是,如果浏览器由多个用户共享,我可以看到一些安全问题


这篇文章似乎列出了一种更好/更新的方法:

使用模块中的
运行
功能,并结合知道用户是否已通过身份验证的服务:

angular
  .module('myApp')
  .run(runFn);
runFn.$inject = ['$rootScope', 'MyAuthService', '$state'];
function runFn($rootScope, MyAuthService, $state){

   $rootScope.$on('$stateChangeSuccess', function(e, toState, toParams, fromState, fromParams) {

          var userAuthenticated =   MyAuthService.isLogged();

          //* check if the user it's present on cookies
          //if(!userAuthenticated && $cookieStore.get('user_token'))
          //  If the token is in the cookies i get the user from server
          //else
          // $state.go('login')

          //your logic here
          /*if (user is not authenticated && state requires authentication) then $state.go('login')*/

    });

}

当状态发生变化时,将始终执行此功能。

使用模块中的
运行
功能,并结合知道用户是否已通过身份验证的服务:

angular
  .module('myApp')
  .run(runFn);
runFn.$inject = ['$rootScope', 'MyAuthService', '$state'];
function runFn($rootScope, MyAuthService, $state){

   $rootScope.$on('$stateChangeSuccess', function(e, toState, toParams, fromState, fromParams) {

          var userAuthenticated =   MyAuthService.isLogged();

          //* check if the user it's present on cookies
          //if(!userAuthenticated && $cookieStore.get('user_token'))
          //  If the token is in the cookies i get the user from server
          //else
          // $state.go('login')

          //your logic here
          /*if (user is not authenticated && state requires authentication) then $state.go('login')*/

    });

}

此功能将在状态发生变化时始终执行。

谢谢。当我执行您提到的行“var userAuthenticated=MyAuthService.isLogged();”时,如何确保服务MyAuthService包含用户是否登录的信息?目前我正在发送一个api调用来检查这一点。还有别的办法吗?一般来说,我用饼干来做这个。检查我编辑的答案。为了更清楚,请阅读这篇优秀的文章,谢谢。当我执行您提到的行“var userAuthenticated=MyAuthService.isLogged();”时,如何确保服务MyAuthService包含用户是否登录的信息?目前我正在发送一个api调用来检查这一点。还有别的办法吗?一般来说,我用饼干来做这个。检查我编辑的答案。要更清楚,请阅读这篇优秀的文章