0

SessionStorageキー/値の存在を単純にチェックするルート変更に関する基本的な認証チェックがあります。ただし、認証されていないユーザーが、コントローラーに AJAX 呼び出しが含まれている禁止されたページに移動した場合、禁止されたページが読み込まれず、代わりにユーザーがログインにリダイレクトされても、バックグラウンドで AJAX 呼び出しが引き続き発生することに気付きました。これを回避するために、すべてのコントローラーに同じ認証チェックを追加しました。これは少し面倒になってきており、コントローラーのメソッドが実行される前に認証をグローバルにチェックする方法、またはより良い方法があるかどうか疑問に思っていました。ルート変更時の認証機能は次のとおりです。

app.run(function ($rootScope, $location, authenticationService) {

    $rootScope.clearAlerts = function(){
        $rootScope.alerts = []
    }

    $rootScope.credentials = {
        username: "",
        password: ""
    };

    $rootScope.goto = function(url){
        $location.path(url);
    }

    $rootScope.authenticated = authenticationService.isLoggedIn()
    $rootScope.logOut = function () {
        authenticationService.logOut();
    }
    var publicRoutes = ['/login'];

    $rootScope.$on('$routeChangeStart', function (event, next, current) {
        $rootScope.credentials.from = $rootScope.desiredPath || '/login'
        $rootScope.authenticated = authenticationService.isLoggedIn();
        if (!_(publicRoutes).contains($location.path()) && !$rootScope.authenticated) {
            $rootScope.desiredPath = $location.path();
            $location.path('/login');
        }
    })
})
4

1 に答える 1

2

サーバー側で認証を確認し、クライアント側で適切なメッセージを返すことをお勧めします

以下は URL ヘルプ http://www.espeo.pl/2012/02/26/authentication-in-angularjs-applicationです。

そしてそれをチェックするためにクライアント側でグローバルハンドラーを書く

以下はサンプルコードです。

angular.module('myApp', ['myApp.filters', 'myApp.services', 'myApp.directives'], function ($routeProvider, $locationProvider, $httpProvider) {

    var interceptor = ['$rootScope', '$q', function (scope, $q) {

        function success(response) {
            return response;
        }

        function error(response) {
            var status = response.status;

            if (status == 401) {
                window.location = "./index.html";
                return;
            }
            // otherwise
            return $q.reject(response);

        }

        return function (promise) {
            return promise.then(success, error);
        }

    }];
    $httpProvider.responseInterceptors.push(interceptor);
于 2013-08-03T07:21:17.977 に答える