如何使用stateprovider阻止用户访问其他视图

时间:2015-08-27 13:17:39

标签: angularjs angular-ui-router

我在尝试阻止用户访问其他观看时遇到了一些问题。 这是我的模块:

angular.module('Project', ['ui.bootstrap', 'ui.bootstrap.tpls', 'cgBusy', 'ui.router', 'templates', 'pascalprecht.translate'])
    .value('cgBusyDefaults', {
        message: 'Please wait ...',
        backdrop: true,
        delay: 300
    })
    .config(function ($stateProvider, $urlRouterProvider) {
        $stateProvider.state('LoginForCustomerInfo', {
            url: '/LoginForCustomerInfo',
            templateUrl: 'app/WebShop/ProjectFeatures/LoginForCustomerInfo/templates/customerInfo.html',
            controller: 'customerInfoCtrl'
        });
        $stateProvider.state('UserInformation', {
            url: '/UserInformation',
            controller: 'UserInformationCtrl',
            templateUrl: 'app/WebShop/ProjectFeatures/UserInformation/templates/userInformation.html'
    }).state('UserInformation.updateAddress', {
            url: '/UpdateAddress',
            templateUrl: 'app/WebShop/ProjectFeatures/UpdateAddressInformation/templates/addressUpdate.html',
            controller: 'AddressController'
        }).state('UserInformation.updateContactInfo', {
            url: '/UpdateCI',
            templateUrl: 'app/WebShop/ProjectFeatures/UpdateContactInformation/templates/contactUpdate.html',
            controller: 'ContactController'
        }).state('UserInformation.viewVoucherHistory', {
            url: '/ViewVoucherHistory',
            templateUrl: 'app/WebShop/ProjectFeatures/ViewVoucherHistory/templates/viewVoucherHistory.html',
            controller: 'voucherhistoryCtrl'
        }).state('UserInformation.shoppingCart', {
            url: '/ShoppingCart',
            templateUrl: 'app/WebShop/ProjectFeatures/ShoppingCart/templates/shoppingCart.html',
            controller: 'ShoppingCartController'
        });

如果我在搜索栏中写下这个http://localhost/project/#/UserInformation/UpdateCI,它将转到该页面而我不想要,首先我希望用户登录,然后他们可以访问UpdateAddress,UpdateContactInformation和等等。
帮我提一些建议。感谢。

1 个答案:

答案 0 :(得分:0)

为了防止用户在未登录的情况下访问页面,您应该使用run功能并检查客户端是否已记录。如果不是,请检查他是否在登录页面以外的其他页面上,如果他在,则重定向。

我建议您使用ngCookies来执行此操作,因为如果用户刷新其页面,AngularJS无法保留数据。 我希望您不需要安排此应用程序,因为它不是这样的。

我这样写:

app.run(['$route', '$location', 'loginService', function($route, $location, loginService) {
    if ($route.current !== '/LoginForCustomerInfo' && !loginService.isLogged()) { // Redirect if the user is not logged and not the login page
        $location.path('/LoginForCustomerInfo');
    }
}]);

您的loginService看起来像:

app.factory('loginService', ['$cookieStore', function ($cookieStore) {
    return {
        isLogged: function () { // Check if user is logged
            return $cookieStore.get('id') !== null;
        },
        loggin: function (id) { // Store its id in the browser's cookies
            $cookieStore.put('id', id);
        }
    }
}]);

您的customerInfoCtrl控制器如下所示:

app.controller('customerInfoCtrl', '$location', ['loginService', function($loginService, $location) {

    if (loginService.isLogged()) { // If user is yet logged, redirect
        $location.path('/UserInformation');
    }

    $scope.submit(function() { // When submit the login form, put the id in the browser's cookies
        loginService.login($scope.id);
        $location.path('/UserInformation');
    });
}]);

不要忘记包含angular-cookie.js并将其注入以下模块中:

<script src="//ajax.googleapis.com/ajax/libs/angularjs/XXXX/angular-cookies.js"></script>

angular.module('myApp', ['ngCookies']);