0

認証プロセスを使用して Web サイトを開発しています。ユーザーは管理者であってもなくてもかまいません。ユーザーをルーティングするために、さまざまなコンポーネントとさまざまな状態を記述します。

HTTP リクエストを制御して認証プロセスを処理していますが、単純なユーザーがアドレスを入力して認証されていないページに移動しようとしたときにリダイレクトを強制したいと考えています。

管理者の URL を入力します。

ここに画像の説明を入力

このユーザーを元のページにリダイレクトするか、強制的に現在のページに留まらせたい...

私はこのようなことをしようとしています: 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 unknownユーザーをfromに適切にリダイレクトするにはどうすればよいadminですか?

4

1 に答える 1

0

状態を解決するためのアンチパターンを書きました。

https://github.com/angular-ui/ui-router/wiki#resolveresolveのプロパティを使用してui-routerください。

チェックに合格した場合(状態が解決されるため)、またはfunction needAdmin() { return Promise (...) //or $q.deffer.promise }チェックに失敗した場合は、 が必要です。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 に答える