AngularJS 授权重定向

AngularJS Redirect for Authorization

我用angularfire 和firebase 构建了一个登录系统。

我有一个函数,当用户登录时会被调用,其他时候也会被调用。检查 authData 是否存在,如果存在则将用户注册为已登录。

fbRef.onAuth(authDataCallback);
function authDataCallback(authData) {
    if (authData) {
        $scope.loggedIn = true;
    } else {
        $scope.loggedIn = false;
    }
}

我也设置了路线

.config(function($routeProvider) {
    $routeProvider
    .when('/', {
        controller: '',
        templateUrl: '/company/pages/account/pages/dashboard.php',
    })
    .when('/dashboard', {
        controller: '',
        templateUrl: '/company/pages/account/pages/dashboard.php',
    })
    .when('/login', {
        controller: 'Authorization',
        templateUrl: '/company/pages/account/pages/login.php',
    })
    .when('/register', {
        controller: 'Authorization',
        templateUrl: '/company/pages/account/pages/register.php',
    })
})

我希望除登录和注册页面之外的每个页面都仅限于登录用户。如果 $scope.loggedIn returns 为假,我希望用户被重定向到登录页面。

我在互联网上尝试了很多解决方案,但 none 对我有用。他们中的大多数都导致了超出限制的错误。

在我的情况下如何限制访问?

您可以检查 "loggedIn" 变量是否有变化

    app.controller('MyCtrl', ['$scope', '$location', function($scope, $location){

        fbRef.onAuth(authDataCallback);

        $scope.loggedIn = null;

        function authDataCallback(authData) {
            $scope.loggedIn = authData ? true : false
        }

        $scope.$watch("loggedIn", function(val){

            val === false && $location.path("/login");

        });

    });

在我们的控制器中,检查回调并相应地重定向。

app.controller('MyCtrl', ['$scope', '$location', function($scope, $location) {

  fbRef.onAuth(authDataCallback);

  function authDataCallback(authData) {
      authData ? $location.path("/dashboard") : $location.path("/login");
  }

}]);

计划:

另一种可能的解决方案是从 $routeProvider 中设置一个名为 loginRequired 的变量 并从 $routeChangeStart 对照 $rootScope.loggedIn 检查变量。

不幸的是,如您所见,您必须将 $scope.loggedIn 移动到 $rootScope.loggedIn

一种可能的实现方式:

在路由器中:

.config(function($routeProvider) {
    $routeProvider
        .when('/', {
            controller: '',
            templateUrl: '/company/pages/account/pages/dashboard.php',
            loginRequired: true
        })
        .when('/dashboard', {
            controller: '',
            templateUrl: '/company/pages/account/pages/dashboard.php',
            loginRequired: true
        })
        .when('/login', {
            controller: 'Authorization',
            templateUrl: '/company/pages/account/pages/login.php',
            loginRequired: false
        })
        .when('/register', {
            controller: 'Authorization',
            templateUrl: '/company/pages/account/pages/register.php',
            loginRequired: true
        })
    })

app.run 中:

app.run(
    ['$rootScope', '$location', function($rootScope, $location) {

        $rootScope.$on('$routeChangeStart', function() {
            if ($rootScope.loginRequired && !$rootScope.loggedIn) {
                $location.path("/login");
            }
        });

    }]);