2016-09-20 2 views
0

EDIT x2Угловая маршрутизатор UI - Обещания и рекурсивный вопрос Перенаправление

В соответствии с Вашим предложением, я сделал много изменений.

Я сделал (я думаю?) Реальное обещание на этот раз, но имел несколько вопросов.

Что вы предложили не работал в какой-то момент для этого:

 // If it is, return true 
    else { 
     console.log('Valid token'); 
     return deferred.resolve(true); 
    } 
} 
// If there's no valid token, return false 
else { 
    console.log('No token'); 
    $localStorage.$reset(); 
    $state.go('login'); 
    return deferred.reject(false); 
} 

я должен был изменить это:

 // If it is, return true 
    else { 
     console.log('Valid token'); 
     deferred.resolve(true);  // Removed "return" 
    } 
} 
// If there's no valid token, return false 
else { 
    console.log('No token'); 
    $localStorage.$reset(); 
    $state.go('login'); 
    deferred.reject(false);   // Removed "return" 
} 

я, наконец, сделал это для переквалификации я ожидал теперь мое обещание работы ...

// Watching login page 
$transitions.onStart({to: 'login'}, function (trans) { 

    // Injecting the authentication service 
    var auth = trans.injector().get('AuthService'); 

    // returning the promise with handlers 
    return auth.isAuthenticated().then(function (res) { 

     // If the token is valid, redirect to the dashboard 
     return trans.router.stateService.target('dashboard.home'); 
    }, function(e) { 

     // If the token is invalid or missing, keep the login page 
     return trans.router.stateService.target; 
    }); 
}); 

// Watching the dashboard private page 
$transitions.onStart({to: 'dashboard.**'}, function (trans) { 

    // Injecting the authentication service 
    var auth = trans.injector().get('AuthService'); 

    // returning the promise with handlers 
    return auth.isAuthenticated().then(function (res) { 

     // If the user is correctly identified, do nothing 
     return trans.router.stateService.target; 
    }, function (e) { 

     // If the token is invalid or missing, deleting datas 
     $localStorage.$reset(); 

     // Setting error message 
     $localStorage.loginError = {'token_expired': true}; 

     // Redirecting to the login page 
     return trans.router.stateService.target('login'); 
    }) 
}); 
+0

вы должны попытаться использовать «решительность» с государственным (UI Router), в котором вы будете фактически аутентификациями пользователя перед входом в это состояние. В вышеприведенном коде вы не возвращаете обещание. –

+0

Hi Shaiilendra, я немного смущен версией этого бета-версии 1.0 beta 2, я считаю, что новая система Transition немного сложна ... У вас есть какой-то пример, чтобы помочь мне справиться с этим? Фактически мой логин работает нормально. Проверка и обновление токена в порядке. Моя проблема заключается в том, что я хочу, чтобы люди не обращались к панели мониторинга, если не прошли аутентификацию, и разрешали им получать доступ напрямую, если у них все еще есть возобновляемый токен на панели мониторинга без входа в систему. Вот где это не получается. Если я использую только первый (пользователь delog), все в порядке. Если я положил два, я займусь бесконечным циклом и не могу понять, почему! –

ответ

0

Вы не возвращаете обещание в вашем isAuthenticated метод а nd также удалите state.go('login') из isAuthenticated, потому что это может вызвать проблему перенаправления. Этот метод должен быть как как-

vm.isAuthenticated = function() { 
       var deferred = $q.defer(); 
       var ts = Math.round((new Date()).getTime()/1000); 

       // Getting token datas 
       var exp = vm.getClaimsFromToken(); 

       console.log('Expire dans : ' + (exp.exp - ts) + 's'); 

       // Check if hte token exist 
       if ($localStorage.token) { 

        // Check if it is still valid 
        if (ts > exp.exp) { 

         // Refresh the token 
         return vm.refreshToken().then(
          function(res) { 
           if (res) { 
            console.log('Refreshing Really Done'); 
            console.log(res); 
            return deferred.resolve(res); 
           } 
          }, 
          // Handle error 
          function (e) { 
           if (!e) { 
            console.log('Refreshing Failed'); 
            $localStorage.$reset(); 
            // $state.go('login'); 
            return deferred.reject(e); 
           } 
          } 
         ) 
        } 
        // If it is, return true 
        else { 
         console.log('Valid token'); 
         return deferred.resolve(true); 
        } 
       } 
       // If there's no valid token, return false 
       else { 
        console.log('No token'); 
        $localStorage.$reset(); 
        // $state.go('login'); 
        return deferred.reject(false); 
       } 
      return deferred.promise; 
      }; 

Здесь метод возвращает обещание первого return deferred.promise и основанное на логике вашего метода, то разрешение или отказ от обещания.

Теперь обработает Перенаправление такого ПУТИ

// Watching login page 
$transitions.onStart({to: 'login'}, function (trans) { 

    // Injecting the authentication service 
    var auth = trans.injector().get('AuthService'); 

    // returning the promise with handlers 
    auth.isAuthenticated().then(function (res) { //remove return keyword 

     // If the token is valid, redirect to the dashboard 
     return trans.router.stateService.target('dashboard.home'); 
    }, function(e) { 

     // If the token is invalid or missing, keep the login page 
     // return trans.router.stateService.target; //removed this line 
    }); 
}); 

// Watching the dashboard private page 
$transitions.onStart({to: 'dashboard.**'}, function (trans) { 

    // Injecting the authentication service 
    var auth = trans.injector().get('AuthService'); 

    // returning the promise with handlers 
    auth.isAuthenticated().then(function (res) { //remove return keyword 

     // If the user is correctly identified, do nothing 
     // return trans.router.stateService.target; //removed this line 
    }, function (e) { 

     // If the token is invalid or missing, deleting datas 
     $localStorage.$reset(); 

     // Setting error message 
     $localStorage.loginError = {'token_expired': true}; 

     // Redirecting to the login page 
     return trans.router.stateService.target('login'); 
    }) 
}); 
+0

Это не решает мой цикл перенаправления. Я все еще получаю цикл с параметрами перехода .run $. Не могу найти почему. Я сделал все изменения, которые вы предложили. Если бы вы могли посмотреть на мой оператор .run и посмотреть, где я получаю такие виды циклов ... Я должен, возможно, сделать чек, чтобы увидеть, откуда происходит перенаправление, чтобы избежать одного из циклов «до», другой, но это превышает мое понимание, так как оно работает со старыми событиями состояния со старыми версиями UI Router. –

+0

@ FrançoisH. Я изменил код. Проверьте это сейчас, я изменил логику в обеих частях для обработки аутентификации. Дайте мне знать, если вы все еще нашли какую-либо проблему. –

 Смежные вопросы

  • Нет связанных вопросов^_^