1

私はgitで撮影したAngular web appテンプレートで作業しています。ユーザーが権限を持っているかどうかを検証する機能はわかりません。ではない?私の目標は、ログインする機能を持つことです。応答を取り、トークンを保存します。 $状態が変わったら、まだトークンがあるかどうか確認してください。どのようにできるのか?アジャスターでのチェックアクセスの承認

のCore.js:

'use strict'; 

angular.module('app.core').controller('App', ['config', '$scope', '$state', '$rootScope', 'shortHistory','session', '$window', 'authorize', function(config, $scope, $state, $rootScope, shortHistory, session, $window, 'authorize') { 

var vm = this; 

vm.title = config.appTitle; 

$scope.app = config; 
$scope.$state = $state; 
vm.currentUser = null; 

$rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) { 
    authorize.checkAccess(event, toState, toParams); 
}); 

$scope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams) { 
    $('body').toggleClass('nav-shown', false); 
}); 

$rootScope.$on('$userSet', function(event, user) { 
    vm.currentUser = user; 
    $window.localStorage.setItem('token', vm.currentUser.token); 
}); 

shortHistory.init($scope); 

}]); 

common.js:

(function() { 
'use strict'; 

angular.module('app.common') 
    .service('shortHistory', shortHistory) 
    .service('session', session) 
// .service('authorize', authorize) 
    .service('authenticationService', authenticationService); 

shortHistory.$inject = ['$state']; 
function shortHistory($state) { 
    var history = this; 

    function setItem(what, state, params) { 
    history[what] = { 
     state: state, 
     params: params 
    }; 
    } 

    this.init = function(scope) { 
    scope.$on('$stateChangeSuccess', function(event, toState, toParams, fromState, fromParams){ 
     setItem('from', fromState, fromParams); 
     setItem('to', toState, toParams); 
    }); 
    }; 

    this.goTo = function(where) { 
    $state.go(history[where].state.name, history[where].params) 
    }; 
} 

session.$inject = ['$http', '$q', '$rootScope']; 
function session($http, $q, $rootScope) { 
    var session = this; 

    this.fetchCurrentUser = function(url) { 
    var userFetch; 
    if (session.getCurrentUser()) { 
     userFetch = $q(function(resolve) { 
     resolve(session.getCurrentUser()); 
     }); 
    } else { 
     userFetch = $http.get(url); 
    } 
    return userFetch; 
    }; 

    this.getCurrentUser = function() { 
    return this.user; 
    }; 

    this.setCurrentUser = function(user) { 
    this.user = user; 
    $rootScope.$broadcast('$userSet', this.user); 
    }; 
} 
/* THIS IS THE CODE THAT I'VE NOT TOUCHED, IT WAS IN THE TEMPLATE 
authorize.$inject = ['session', '$state', '$urlRouter', '$rootScope']; 
function authorize(session, $state, $rootScope) { 
    this.checkAccess = function(event, toState, toParams) { 
    if (!session.getCurrentUser() && !(toState.data && toState.data.noAuth)) { 
     event.preventDefault(); 
     session.fetchCurrentUser('api/sers') 
     .success(function(user) { 
      session.setCurrentUser(user); 
      $state.go(toState.name, toParams); 
     }) 
     .error(function() { 
      $state.go('login'); 
     }); 
     } 
    }; 
} 
*/ 
authenticationService.$inject = ['$http', '$rootScope', 'session', '$state']; 
function authenticationService($http, $rootScope, session) { 
    var vm = this; 
    vm.loginError = ''; 
    this.login = function(user) { 
    var userData = { 
     email: user.email, 
     password: user.password 
    } 
    return $http.post('api/login/', userData) 
     .success(function(data) { 
     var loggedUser = jQuery.extend(data, userData); 
     session.setCurrentUser(loggedUser); 
     $rootScope.$broadcast('$userLoggedIn'); 
     }); 
    }; 

    var token = localStorage.getItem('token'); 

    this.logout = function() { 
    return $http.post('api/logout/', token) 
     .success(function(data) { 
     session.setCurrentUser(null); 
     $rootScope.$broadcast('$userLoggedOut'); 
     }); 
    } 
} 

})(); 

Auth.js:

(function() { 
'use strict'; 

angular.module('app.profile') 
    .controller('LoginController', loginController) 
    .run(runAuth); 

loginController.$inject = ['authenticationService']; 
function loginController(
    authenticationService 
) { 
    var vm = this; 
    vm.user = {}; 
    vm.loginError = ''; 

    this.login = function() { 
    authenticationService.login(vm.user) 
     .then(null, function(err) { 
     vm.loginError = err.data.result; 
     }); 
    }; 
} 

runAuth.$inject = ['$rootScope', '$state', 'authenticationService']; 
function runAuth($rootScope, $state, authenticationService) { 
    $rootScope.logout = authenticationService.logout; 
    $rootScope.$on('$userLoggedIn', function() { 
    $state.go('app.dashboard'); 
    }); 
    $rootScope.$on('$userLoggedOut', function() { 
    $state.go('login'); 
    }); 
} 
})(); 

profile.module.js:

これはコードであります
'use strict'; 

angular.module( 'app.profile'、[ 'ui.router'])

.config(['$stateProvider', function($stateProvider) { 
    $stateProvider 
    .state('login', { 
     url: '/login', 
     data: { 
     noAuth: true 
     }, 
     templateUrl: 'app/modules/profile/auth/login.html', 
     controller: 'LoginController', 
     controllerAs: 'vm' 
    }) 
    .state('app.profile', { 
     url: '/profile', 
     templateUrl: 'app/modules/profile/edit/edit.html', 
     controller: 'ProfileController', 
     controllerAs: 'vm' 
    }); 
    }]); 

元のプロジェクトはこれです:私は、認証がどのように機能するかを理解することはできませんhttps://github.com/flatlogic/angular-dashboard-seed 、どこで挿入します認証のためのコントローラ。たとえば、今はログインできませんがログアウトはできません。トークンがない場合でも、/ dashboardに正しく移動できますが、/ profileはログに記録されたユーザーだけが表示する必要があります。

答えて

0

あなたはここにかなりのコードがありますが、私はあなたの質問がより多くのコードよりも理論的に答えられるように感じています!

  • バックエンドサーバーを使用して、セッション情報(通常はHTTPヘッダーのCookie)を設定し、AngularJSコードでローカル操作を行わないでください。私はあなたがローカルストレージをチェックしているいくつかの領域を参照してください。バックエンドでHTTPのみのフラグをtrueに設定し、セッションIDを知らずにアプリケーションロジックを構築するようにすると、より簡単で安全になります。
  • 401ページのajaxリクエストをログインページにリダイレクトするインターセプトを利用します。これにより、セッションタイムアウト、許可されていないルート訪問などのインスタンスを処理することができます。リダイレクトロジックの多くは単純なハンドラですhttps://docs.angularjs.org/api/ng/service/ $ http#インターセプタ
  • ルーティングによっては、UIルータ)では、認証サービスから返されたユーザーに基づいて特定のルートへのアクセス許可を管理できます。私が遭遇した最もクリーンな実装は、UIルータとネストされた状態を利用していました。認証を必要とする状態には、ユーザーのセッションの検証(ユーザーが認証されているかどうかを判断するための保護されたエンドポイントへの単なるHTTP GET)を実行したルート「解決」パラメーターが構成されています。あなたが任意のコントローラにユーザーを知っておく必要があり、あなたは常にあなたのユーザサービスがすでにそれが考え出していない(と放送に頼る必要はありません)していることを知ることができるときには、例えば、

このアーキテクチャを本当に感謝します:

$stateProvider 
    .state('rootProtected', { 
    templateUrl: '/js/views/rootProtected.html', 
    resolve: { 
     data: function(coreuser) { 
     return user.initialize(); 
     } 
    } 
    }) 
    .state('rootProtected.userProfile', { 
    templateUrl: '/js/views/userProfile.html' 
    }) 
    .state('public', { 
    templateUrl: '/js/views/login.html' 
    }); 
  • セッション管理に関してあまりにも多くのサービス/ファクトリを作成しないようにしてください。私はインターネット上のチュートリアルでこれを見る。実際には、ユーザーをログに記録し、ユーザーをログオンし、ユーザーを検証し、ユーザーを取得するコアユーザーサービスを作成するだけです。多くのデータが相互に関連し、ロジック間に散在する理由はないことを認識し始めます複数のサービスまたはブロードキャストイベント。