繁体   English   中英

如何在angularjs应用程序中限制视图

[英]how to restrict view in angularjs application

我想限制用户访问我的angular js应用程序中的/ dashboard视图和/ add-item视图或任何其他视图。

这是我的路由器

app.config(function($stateProvider, $urlRouterProvider){

        $urlRouterProvider.otherwise('login');

        $stateProvider.
            state('app.dashboard', {
                url: '/dashboard',
                templateUrl: appHelper.viewsPath('dashboard/views/dashboard'),
                controller: 'DashBoardController as DashBordCtrl',
     }).

            // Add Item
            state('app.add-item', {
                url: '/add-item',
                templateUrl: appHelper.viewsPath('item/views/add-item'),
                controller: 'ItemController as ItemCtrl',
            })
        });

登录后,我将令牌存储在本地存储中。 如果令牌不存在,我希望用户不访问任何视图。

这是我的登录控制器

$scope.register = function(credentials){
       LoginService.post(credentials,function(success){
           $state.go('app.add-item');
          SessionService.set("token",success.accessToken);


             },function(error){
       FlashService.showError("Please Enter Valid Email Password");
        });
    }
    }

在401错误上,我正在重定向到登录页面,如下所示:

app.config(function ($httpProvider) {
   // $http.defaults.headers.common.Authorization = '';
     delete $httpProvider.defaults.headers.common['X-Requested-With'];

    $httpProvider.interceptors.push(function ($location, $q, SessionService, FlashService) {
        return {
            request: function (config) {
                 config.headers = config.headers || {};
                config.headers.Authorization = SessionService.get('token');
                return config;
            },
            responseError: function (response) {
                if (response.status === 401) {
                   SessionService.unset('token');
                    $location.path('/login');
                }
                return $q.reject(response);
            }
        };
    });
});

但是,如果我在url中键入/ add-item,我的add-item页面正在打开,然后突然关闭,因为服务器返回401,并且出现了登录页面。如果用户未登录,我不想打开任何视图。

我是angularjs的新手,我对此感到困惑。 请帮忙。

如果令牌不存在,您可以保存用户的位置,以便在用户登录后将其带回到同一页面。您可以在app.js中查看以下代码:

app.config(function($stateProvider, $urlRouterProvider){    

        $stateProvider.
            state('app.dashboard', {
                url: '/dashboard',
                templateUrl: appHelper.viewsPath('dashboard/views/dashboard'),
                controller: 'DashBoardController as DashBordCtrl',
     }).

            // Add Item
            state('app.add-item', {
                url: '/add-item',
                templateUrl: appHelper.viewsPath('item/views/add-item'),
                controller: 'ItemController as ItemCtrl',
            })
 $urlRouterProvider.otherwise('login');
        });

$ urlRouterProvider.otherwise('login')替换为app.config中的$ urlRouterProvider.otherwise('app / dashboard')。如果它是$ urlRouterProvider.otherwise('login'),则您仍然有一个令牌,仍然会出现登录页面。

 app.config(function ($httpProvider) {
       // $http.defaults.headers.common.Authorization = '';
         delete $httpProvider.defaults.headers.common['X-Requested-With'];

        $httpProvider.interceptors.push(function ($location, $q, SessionService, FlashService) {
            return {
                request: function (config) {
                     config.headers = config.headers || {};
                    config.headers.Authorization = SessionService.get('token');
                    return config;
                },
                responseError: function (response) {
                    if (response.status === 401) {
                       SessionService.unset('token');
                        $location.path('/login');
                    }
                    return $q.reject(response);
                }
     if (!SessionService.get('token');) {
                    /* You can save the user's location to take him back to                 the same page after he has logged-in */
                    $rootScope.savedLocation = $location.url();

                    $location.path('/login');
                }
            };
        });
    });

您应该在路由配置中使用resolve 例:

state('app.add-item', {
            url: '/add-item',
            templateUrl: appHelper.viewsPath('item/views/add-item'),
            controller: 'ItemController as ItemCtrl',
            resolve: ['SomeService', function(SomeService) {
                return SomeService.getDataFromApi();
            }]
        })

查看此示例,如果SomeService返回401(表示错误),则该路由控制器将永远不会实例化,因此您无法访问视图。 您的拦截器仍会执行其工作,并在401发生时重定向到登录名,但是现在它将顺利进行并且视图没有闪烁。

这是一个很好的方法,它将解决您以及以后可能遇到的其他问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM