Angularjs 角度用户界面路由器&;安全
我正在尝试使用angular ui router的Angularjs 角度用户界面路由器&;安全,angularjs,angular-ui-router,Angularjs,Angular Ui Router,我正在尝试使用angular ui router的resolve功能在我的应用程序中实现一些安全性。我根据这个问题的第二个答案中的解决方案#2制定了一个解决方案: 它工作正常,只是我不想让用户导航到的路由的控制器仍然是实例化的。我或多或少地遵循John Papa对Angular的建议,因此我在每个控制器中都有一个activate功能。我可以在这里再次检查身份验证,但这需要对我的每个控制器进行重复工作。另外,从原始答案中删除authenticate函数中的$timeout,似乎不会产生负面影响 以
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”代码,但这并不能真正实现异步承诺。阅读文档,这意味着所有这些都应该在控制器实例化之前发生,否则跟踪会显示。