AngularJS中的路由权限

时间:2016-12-07 16:34:30

标签: angularjs

您好我的安全性在我的app角度,是用户未登录无法访问任何管理路由,在这种情况下我有这个代码:

app.run(function($rootScope, $location, loginService){
    var routespermission=['/admin','/products','/products/','/products/:id/edit','/productos/:id/delete'];  //route that require login
    $rootScope.$on('$routeChangeStart', function(){
        if( routespermission.indexOf($location.path()) !=-1)
        {
            var connected=loginService.islogged();
            connected.then(function(msg){
                if(!msg.data) $location.path('/login');
            });
        }
    });
});

第一条路线工作正常,但使用格式为#34;产品/ 1 /编辑"显示给用户未记录,似乎这部分缺少某些东西,以致用户无法编辑和删除记录

2 个答案:

答案 0 :(得分:0)

我不是安全专家,但我在我的应用程序中执行以下操作。我为路由本身分配了一个权限,在运行中我使用的服务包含我当前用户的权限,并检查用户是否包含所需的权限。

    $rootScope.$on('$routeChangeStart', function (event, next, current) {
        if (next.permission !== undefined && next.permission !== null) {
            if (!permissionStore.hasPermission(next.permission)) {
                $location.path('/');
            }
        }
    });

在路线上:

    $routeProvider
        .when('/SomeRoute',
    {
        templateUrl: 'something.html',
        controller: 'SomeController',
        controllerAs: 'vm',
        permission: 'Some Permission'
    });

因此,如果用户没有“一些权限”,它将重定向它们。希望这会有所帮助。

答案 1 :(得分:0)

你可以使用ui-router做类似的事情。下面我将状态定义为示例和函数,以根据条件阻止路由。我在我的应用程序中执行以下操作。

.state('products', {
                url: '/products',
                views: {
                    'pageContent@': {
                        templateUrl: 'app/views/products/product.html',
                        controller: 'productController',
                        controllerAs: 'vm'
                    }
                }
            })

    .state('products_os', {
                url: '/products',
                views: {
                    'pageContent@': {
                        templateUrl: 'app/views/products/product_os.html',
                        controller: 'productOsController',
                        controllerAs: 'vm'
                    }
                }
            })      

 $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {

                    var restrictedRoute: ['admin', 'products','product_os'];

                    angular.forEach($http.pendingRequests, function(request) {
                        request.canceler.resolve();
                    });

                    if (toState.name === "login" && authenticationService.IsAuthenticated() === true) {
                         return $state.go('products');         
                    } else {
                         authenticationService.clearCredentials();
                         $state.go('login');
                    }

                    if ($.inArray(fromState.name, restrictedRoutes) === -1) return;
        });

希望这会对你有所帮助。感谢