推迟角UI路由器$ stateChangeStart直到服务器授权响应receieved [英] Defer Angular UI Router $stateChangeStart until server authorization response receieved

查看:118
本文介绍了推迟角UI路由器$ stateChangeStart直到服务器授权响应receieved的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的UI路由器在那里我试图验证用户的令牌,如果存在一个角度应用程序,该应用程序运行时。我也检查用户有权访问某些码路线。问题是, $ stateChangeStart 是运行我收到的响应从授权端点回来。下面是一些code(CoffeeScript的下面JS) - 这是我所有的运行块中。

I have an Angular app using UI Router where I'm trying to validate a user's token, if one exists, when the app runs. I am also checking that the user has permission to access certains routes. The problem is that $stateChangeStart is running before I receive the response back from the authorization endpoint. Here's some code (coffeescript with js below) - this is all within my run block.

app.run(($rootScope, $state, $stateParams, $log, Auth) ->

  currentState = 'home'

  $rootScope.$state = $state

  # read a cookie if cookie exists
  if Auth.setAuthenticationToken()
    # hit api endpoint to validate token
    Auth.validateToken (user) ->
      # route to current state
      # this returns after $stateChangeStart runs below
      $state.go(currentState)

  $rootScope.$on '$stateChangeStart', (event, toState, toParams, fromState, fromParams) ->

    currentState = toState.name

    Auth.setAuthenticationToken()

    $rootScope.error = null

    # compare users access permissions with incoming route's access level
    if (!Auth.authorize toState.data.access, Auth.user)
      event.preventDefault()
      $rootScope.error = "Sorry, you haven't provided the required credentials."
      $log.warn $rootScope.error
)

我的问题是我怎么能获得 $ stateChangeStart 来已归还从AUTH端点的响应之后才运行。这只需要发生的第一次。每个后续状态变化可以没有击中AUTH终端来实现。

My question is how can I get the $stateChangeStart to run only after the response from the auth endpoint has been returned. This only needs to happen the first time. Every subsequent state change can be done without hitting the auth endpoint.

推荐答案

我想创建一个返回的承诺你的验证服务的功能。后来,解决(授权)或拒绝(不authrized)递延。然后使用它的决心你的路由定义属性

I'd create a function in your Auth service that returns a promise. Later, resolve (authorized) or reject (not authrized) that deferred. Then use it on the resolve property of your route definitions

$stateProvider.state('stateName',{
    ...
    ...
    resolve: {
         isAuthorized: function(Auth){
             return Auth.checkAuthorization();
         }
    }
})

要支持后续检查,你可以保持服务中的承诺,这可能是这样的:

To support subsequent checks you could maintain a promise within the service This might look like:

myApp.service('Auth',function($http,$q){
    var authStatusDeferred = $q.defer();
    this.checkAuthorization = function(){
        return authStatusDeferred.promise;
    };

    this.validateToken = function(user){
        var isValid = false;
        //..do validation stuff
        if(isValid) authStatusDeferred.resolve();
        //Otherwise state change will not happen..            
    };



});

哦,抱歉没有咖啡

oh, sorry about no coffee

这篇关于推迟角UI路由器$ stateChangeStart直到服务器授权响应receieved的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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