5

ログインしていない場合にユーザーをログインルートにリダイレクトする方法をきれいに実装しようとしています。私は、すぐには機能しない別の SO 回答hereに基づいてソリューションを構築しています。これが私の解決策です。

angular.module('myApp', ['ngResource', 'ngRoute'])
  .config(['$routeProvider', function ($routeProvider) {
    var requireAuthentication = function () {
        return {
            load: function ($q) {
                console.log('Can user access route?');
                if (g_isloggedIn === true) { // fire $routeChangeSuccess
                    var deferred = $q.defer();
                    deferred.resolve();
                    console.log('Yes they can!');
                    return deferred.promise;
                } else { // fire $routeChangeError
                    console.log('No they cant!');
                    return $q.reject("'/login'");
                }
            }
        };
    };

    $routeProvider
        .when('/some_page_that_requires_authentication', {
            templateUrl: '/views/secret.html',
            controller: 'secretCtrl',
            resolve: requireAuthentication()
        })
        .when('/anybody_can_see_me', {
            templateUrl: '/views/public.html',
            controller: 'publicCtrl',
        });
}]);

$routeChangeError私の質問は、ルートをリダイレクトできるように、イベントをどこで聞くことができるかということです。ディレクティブで実行しようとしましたが、イベントを発生させることができませんでした。promise が拒否されると読み込まれないため、コントローラに配置できません。何かご意見は?

4

3 に答える 3

3

関数内からユーザーをリダイレクトしてはいけない理由はありますか? これは私にとってはうまくいきます。約束が解決されない場合、コントローラー/ビューは読み込まれません。

この関数を次のように変更しました。

var requireAuthentication = function () {
    return {
        load: function ($q, $location) {
            console.log('Can user access route?');
            var deferred = $q.defer();
            deferred.resolve();
            if (g_isloggedIn === true) { // fire $routeChangeSuccess
                console.log('Yes they can!');
                return deferred.promise;
            } else { // fire $routeChangeError
                console.log('No they cant!');
                $location.path('/login');

                // I don't think this is still necessary:
                return $q.reject("'/login'");
            }
        }
    };
};
于 2014-05-05T15:35:39.173 に答える
0

この質問でいくつかのヘルプが見つかるかもしれません: AngularJS: $rootScope.$on('$routeChangeSuccess を理解する)

一般的に、認証を確実にするために「解決」を使用するのは少し奇妙に感じますが、それほど良い方法はありません。いくつかのサービスなどを追加することをお勧めします。

最後に、 https://github.com/dotJEM/angular-routingなどの他のルーティング ソリューションを使用すると、より適切な制御が提供される場合があります。

于 2013-12-13T11:56:38.460 に答える