0

我开发了一个带有身份验证过程的网站。用户可以是管理员也可以不是。我编写不同的组件和不同的状态来路由用户。

我已经控制 HTTP 请求来处理身份验证过程,但是当简单用户尝试使用键入地址转到未授权页面页面时,我想强制重定向。

例子

他输入管理员网址:

在此处输入图像描述

我想将此用户重定向到他来自的页面,或强制他留在当前页面...

我尝试做这样的事情: www.seanmarchetti.com/authentication_with_angularui_router.html

但我有不同的项目结构

在此处输入图像描述

我在“管理员”中控制对状态的访问,我想使用$state.go,但非管理员状态..我尝试使用toState但没有工作(或者我可能不明白如何正确使用它)

这是我的代码admin.router.js

'use strict';

angular.module('appModule.admin')
  .config(function ($stateProvider, $urlRouterProvider) {

    $urlRouterProvider.when('/admin', '/admin/users');

    $stateProvider
      .state('admin', {
        url: '/admin',
        redirectTo: 'admin.users',
        template: '<admin></admin>',
        needAdmin: true,
      })
      .state('admin.users', {
        url: '/users',
        template: '<users></users>',
        needAdmin: true,
      })
      .state('admin.apis', {
        url: '/apis',
        template: '<engines></engines>',
        needAdmin: true,
      })

  })
  .run(function ($rootScope, $state, Auth) {
    $rootScope.$on('$stateChangeStart', function (event, toState, toParams, fromState, fromParams) {
      if (toState.needAdmin && !Auth.isAdmin()) {
        console.log('fromstate', fromState);
        console.log('tostate', toState);
        $state.go('/*UNKNOWN  STATE FROM HERE*/');
        event.preventDefault();
      }
    });
  });

谁能帮助我如何将用户正确重定向到.state unknownfrom admin

4

1 回答 1

0

您刚刚为解决状态编写了反模式。

请使用resolve来自ui-routerhttps ://github.com/angular-ui/ui-router/wiki#resolve 的属性。

如果您的检查通过(因此状态将被解决)或您的检查失败,您应该有一个function needAdmin() { return Promise (...) //or $q.deffer.promise }that will 。resolve(true)reject(); $state.go(...)

reject()将自动停止您的状态立即解决(没有任何承诺等待在内存中解决以避免内存泄漏)。

resolve()只会允许解析(访问)状态。

简单的例子:

// somewhere in your AuthFactory
AuthFactory.isAdmin () {
  var deferred = $q.defer();
  
  if (AuthFactory.isAdmin === true) {
    deffered.resolve(true);
  } else {
    deffered.reject('Not an admin');
    $state.go('...');
  }
  
  return deferred.promise;
}
// in your configuration
$stateProvider
  .state('admin', {
    url: '/admin',
  
    ...
  
    resolve: {
      checkAdminBeforeAccessing: function (AuthFactory) {
        return AuthFactory.isAdmin();
      }
    }
  })
  .state('anotherStateNeedAdmin', {
    url: '/another',
  
    ...
  
    resolve: {
      checkAdminBeforeAccessing: function (AuthFactory) {
        return AuthFactory.isAdmin();
      }
    }

于 2016-07-20T12:31:13.737 回答