Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
防止基于HTTP请求的AngularJS中未经授权的URL更改_Angularjs_Ngroute - Fatal编程技术网

防止基于HTTP请求的AngularJS中未经授权的URL更改

防止基于HTTP请求的AngularJS中未经授权的URL更改,angularjs,ngroute,Angularjs,Ngroute,我试图阻止基于HTTP访问授权端点的结果在AngularJS中导航(这与我的Spring安全体系结构有关,但这对这个问题并不重要) 我已将以下内容附加到附加到顶级模块的run()块: $rootScope.$on("$locationChangeStart", function(event, newUrl, oldUrl) { var path = $location.path(); $http.get('/svc/authorize/view?urlP

我试图阻止基于HTTP访问授权端点的结果在AngularJS中导航(这与我的Spring安全体系结构有关,但这对这个问题并不重要)

我已将以下内容附加到附加到顶级模块的run()块:

    $rootScope.$on("$locationChangeStart", function(event, newUrl, oldUrl) {

        var path = $location.path();
        $http.get('/svc/authorize/view?urlPath=' + path).then(response => {
            if (response.data.result === "NOT_AUTHORIZED") {
                event.preventDefault();
                console.log("Prevented unauthorized location change");
                $ui.showError("Unable to Navigate to " + newUrl);
            }

        });
    });
(注意:$ui是我们的服务,不是AngularJS或第三方工具)

不幸的是,由于异步$http.get(),页面在调用完成之前加载

如果有帮助,以下是路线定义的示例:

    $routeProvider.when('/problem', {
        templateUrl: '/app/management/problem/problem.tmpl.html',
        controller: 'problemCtrl'
    });

有人能帮我吗?我希望我只是在处理异步调用时犯了一个愚蠢的错误。

人们通常在路由中使用
resolve
函数来防止未经授权的路由加载

$routeProvider.when('/problem', {
    templateUrl: '/app/management/problem/problem.tmpl.html',
    controller: 'problemCtrl',
    resolve: {
        authorized: function($http) {
            return $http(someUrl).then(function(response) {
                var data = response.data;
                if (response.data.result === "NOT_AUTHORIZED") {
                    console.log("Prevented unauthorized location change");
                    throw "NOT AUTHORIZED";
                };
                //ELSE
                return data;
            });
        }
    }
});
resolve
函数返回承诺时,路由器将等待承诺被解析或拒绝,然后再实例化控制器。如果成功解析所有承诺,则注入已解析承诺的值并触发事件。如果任何承诺被拒绝,事件将被触发

有关详细信息,请参阅



是否有一种方法将授权中的功能与单个位置的所有路由关联,而不是修改每个单独的路由

可以重新分解代码以使用服务:

$routeProvider.when('/problem', {
    templateUrl: '/app/management/problem/problem.tmpl.html',
    controller: 'problemCtrl',
    resolve: { auth: (AuthService,$route) => AuthService.check($route) }
})

使用
$route.current.params
访问建议的新路由的参数。

通常在路由中使用
解析
功能来防止未经授权的路由加载

$routeProvider.when('/problem', {
    templateUrl: '/app/management/problem/problem.tmpl.html',
    controller: 'problemCtrl',
    resolve: {
        authorized: function($http) {
            return $http(someUrl).then(function(response) {
                var data = response.data;
                if (response.data.result === "NOT_AUTHORIZED") {
                    console.log("Prevented unauthorized location change");
                    throw "NOT AUTHORIZED";
                };
                //ELSE
                return data;
            });
        }
    }
});
resolve
函数返回承诺时,路由器将等待承诺被解析或拒绝,然后再实例化控制器。如果成功解析所有承诺,则注入已解析承诺的值并触发事件。如果任何承诺被拒绝,事件将被触发

有关详细信息,请参阅



是否有一种方法将授权中的功能与单个位置的所有路由关联,而不是修改每个单独的路由

可以重新分解代码以使用服务:

$routeProvider.when('/problem', {
    templateUrl: '/app/management/problem/problem.tmpl.html',
    controller: 'problemCtrl',
    resolve: { auth: (AuthService,$route) => AuthService.check($route) }
})

使用
$route.current.params
访问建议的新路由的参数。

通常在路由中使用
resolve
功能来防止加载未经授权的路由。通常在路由中使用
resolve
功能来防止加载未经授权的路由。是否有方法将该功能关联到授权所有路线在一个地方,而不是修改每个单独的路线?服务是一个方向。然而,$routeProvider中是否有一个参数,我可以迭代for/foreach循环中的所有路由,并将此服务附加到它?工作非常出色。谢谢。有没有一种方法可以将授权中的功能与一个地方的所有路线相关联,而不是修改每个单独的路线?服务是一种方法。然而,$routeProvider中是否有一个参数,我可以迭代for/foreach循环中的所有路由,并将此服务附加到它?工作非常出色。非常感谢。