如果用户未经过身份验证,则Angular ui-router立即重定向

时间:2016-03-16 23:14:39

标签: angularjs angular-ui-router

我正在使用public class BidMonitor extends Thread { public synchronized void run() { while (valueHeldOnClient == valueHeldOnServer) { wait(); } valueHeldOnClient = valueHeldOnServer; notifyAll(); } } (0.2.18),如果用户未登录或不允许查看内容,我想限制对某些页面的访问。

我想出了下面的解决方案,但即使我没有登录,我仍然可以看到该页面一秒钟,然后我被重定向到UserID页面。显然这很难看,如何在加载页面之前进行检查?我正在努力寻找模块化解决方案。

我做后端检查,所以如果用户没有登录,他/她无论如何都看不到任何东西,但是这个重定向的东西让我感到烦恼。

$UserID

路线

$UserID = 1

1 个答案:

答案 0 :(得分:3)

这是一个基于我检查状态的应用程序的示例。需要注意的主要事项是:

  • 在状态上使用数据属性,因为子状态将继承其父项的数据属性。这将允许所需的身份验证免费传播到子状态。

  • 您正在检查用户是否已登录正在使用http请求,这很糟糕,因为您会因延迟而遇到延迟。如果用户已登录,您应该使用服务变量或会话存储来保存标志,这样在检查身份验证状态时不会有延迟。

  • 使用$ state.go()而不是设置window.location可能是更好的解决方案,因为你正在使用html5模式,它可能会解释这个以进行整页重新加载而不是哈希更改(不确定我通常不使用html5模式)。

希望这会有所帮助:

var core = angular.module("core", ["ui.router", "ngStorage"]);
core.run(["$rootScope", "$state", "AuthService", function ($rootScope, $state, Auth) {
    $rootScope.$on("$stateChangeStart", function (evt, toState, toParams, fromState, fromParams) {
        if (toState.name !== "login" &&
            _.get(toState, "data.authenticate", false) &&
            !Auth.isLoggedIn()) {
            $state.go("login");
            evt.preventDefault();
        }
    });
}]);

core.factory("AuthService", ["$http", "$sessionStorage", "$q",
    function ($http, $sessionStorage, $q) {
    return {
        isLoggedIn: function () {
            return !!$sessionStorage.user;
        },
        localLogin: function (email, password) {
            var def = $q.defer();
            $http
                .post("/login", { email: email, password: password })
                .then(function (res) {
                    if (_.has(res, "data.error")) {
                        def.reject(res.data.error);
                    } else {
                        $sessionStorage.user = res.data.user;
                        def.resolve();
                    }
                })
                .catch(function (err) {
                    def.reject(err);
                });
            return def.promise;
        }
    };
}]);

core.config(["$stateProvider", "$urlRouterProvider",
    function ($stateProvider, $urlRouterProvider) {

        // For all unmatched url, redirect to /login
        $urlRouterProvider.otherwise("/login");

        $stateProvider
            .state("login", {
                url: "/login",
                views: {
                    "": {
                        templateUrl: "app/core/templates/login.html",
                        controller: "core.login.ctrl",
                        controllerAs: "vm"
                    }
                }
            })
            .state("profile", {
                url: "/profile",
                data: {
                    authenticate: true
                },
                views: {
                    "": {
                        templateUrl: "app/core/templates/profile.html",
                        controller: "core.ctrl",
                        controllerAs: "vm"
                    }
                }
            });
    }]);