Angularjs 角度用户界面路由器&;安全

Angularjs 角度用户界面路由器&;安全,angularjs,angular-ui-router,Angularjs,Angular Ui Router,我正在尝试使用angular ui router的resolve功能在我的应用程序中实现一些安全性。我根据这个问题的第二个答案中的解决方案#2制定了一个解决方案: 它工作正常,只是我不想让用户导航到的路由的控制器仍然是实例化的。我或多或少地遵循John Papa对Angular的建议,因此我在每个控制器中都有一个activate功能。我可以在这里再次检查身份验证,但这需要对我的每个控制器进行重复工作。另外,从原始答案中删除authenticate函数中的$timeout,似乎不会产生负面影响 以

我正在尝试使用angular ui router的
resolve
功能在我的应用程序中实现一些安全性。我根据这个问题的第二个答案中的解决方案#2制定了一个解决方案:

它工作正常,只是我不想让用户导航到的路由的控制器仍然是实例化的。我或多或少地遵循John Papa对Angular的建议,因此我在每个控制器中都有一个
activate
功能。我可以在这里再次检查身份验证,但这需要对我的每个控制器进行重复工作。另外,从原始答案中删除authenticate函数中的
$timeout
,似乎不会产生负面影响

以下是我如何设置处理此问题的路线:

$stateProvider.state('orderqueue', {
                url: "/orderqueue",
                templateUrl: "views/orderqueue.html",
                controller: 'orderQueueController',
                controllerAs: 'orders',
                role: 'Order Admin', 
                resolve: {authenticate: authenticate}
            });
我的身份验证函数如下所示:

function authenticate($q,$state,$timeout, UserService) {
            (new UserService()).$getUser().then(
                function(user) {
                    var role = ($state.current.role) ? $state.current.role :$state.current.name ;

                    // alert(role) ;
                    if (user.userName == 'wmfeltman') {
                        return $q.when()    
                    } else
                    {
                        //  $timeout(function() {
                        // This code runs after the authentication promise has been rejected.
                        // Go to the log-in page
                            $state.go('login')
                        // })
                        // Reject the authentication promise to prevent the state from loading
                        return $q.reject()
                    }
                }
            ) 
        }

在控制器实例化之前,有没有办法让resolve启动?文件似乎表明这是它应该如何工作,但事实并非如此

这很简单。我看到大多数人在状态配置本身中定义
控制器

但是您应该使用
ng controller
在视图中定义控制器,如下所示:

function authenticate($q,$state,$timeout, UserService) {
            (new UserService()).$getUser().then(
                function(user) {
                    var role = ($state.current.role) ? $state.current.role :$state.current.name ;

                    // alert(role) ;
                    if (user.userName == 'wmfeltman') {
                        return $q.when()    
                    } else
                    {
                        //  $timeout(function() {
                        // This code runs after the authentication promise has been rejected.
                        // Go to the log-in page
                            $state.go('login')
                        // })
                        // Reject the authentication promise to prevent the state from loading
                        return $q.reject()
                    }
                }
            ) 
        }
views/orderqueue.html

<div ng-controller="orderQueueController as orders">
    <!-- your stuff -->
</div>

这样,如果您的身份验证不成功,
orderqueue
将不会加载,因此,您的
视图/orderqueue.html
将不会加载,因此控制器将不会实例化(因为控制器是用html视图启动的)。

我想这很简单,但不是真正需要的。实际上,我正在为我所有的路由、控制器、模板等开发一个数据驱动的解决方案,我不喜欢在视图中嵌入控制器引用。1.5中的新路由器功能相同吗?现在朝这个方向走似乎是一个很好的举措,因为这也将有助于Angular 2.0迁移的准备工作。不过,请注意,您的建议确实如预期的那样有效。实际上,我收回了我的评论。在使用此方法调用resolve之前,控制器仍然是实例化的。谢谢。由于resolve函数实际上被注入到控制器中,因此resolve在这里似乎不是一个可行的选项。我想,如果在解析之后可以调用控制器方法,那么以这种方式构造东西是可行的。由于resolve属性实际上是一个map对象,因此似乎可以在map对象的第二项中简单地使用“activate”代码,但这并不能真正实现异步承诺。阅读文档,这意味着所有这些都应该在控制器实例化之前发生,否则跟踪会显示。