【问题标题】:Preventing Unauthorized URL Changes in AngularJS Based on HTTP Request基于 HTTP 请求防止 AngularJS 中未经授权的 URL 更改
【发布时间】:2019-10-11 06:19:23
【问题描述】:

我试图阻止基于 HTTP GET 到授权端点的结果在 AngularJS 中导航(这与我的 Spring Security 架构相关,但这对这个问题并不重要)。

我已将以下内容附加到附加到我的顶级模块的 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函数来防止未经授权的路由加载。

标签: angularjs ngroute


【解决方案1】:

通常在路由中使用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 函数返回promise 时,路由器将在控制器实例化之前等待promise 被解析或拒绝。如果所有的 Promise 都成功解决,则注入已解决的 Promise 的值并触发 $routeChangeSuccess 事件。如果任何承诺被拒绝,$routeChangeError 事件就会被触发。

有关详细信息,请参阅


有没有办法将授权中的功能与一个地方的所有路线相关联,而不是修改每个单独的路线?

可以重构代码以使用服务:

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

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

【讨论】:

  • 有没有办法将授权的功能与一个地方的所有路线相关联,而不是修改每个单独的路线?
  • 服务才是王道。但是,$routeProvider 内部是否有一个参数,我可以在 for/foreach 循环中迭代所有路由并将此服务附加到?
  • 效果很好。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 2017-11-21
相关资源
最近更新 更多