我不知道如何限制对角度特定视图的访问。我认为你不应该限制观点。您应该做的是限制对您的 api 的访问。因此,如果用户没有权限删除项目。当他调用 api 时,只需从服务器发送 401 即可。在客户端使用 $http 拦截器以角度处理这个 401。
我会做以下事情:
在您的 index.html 中创建一个元素/指令以显示错误消息
索引.html
<div ng-controller=ErrorMessageCtrl ng-show=error.message>
{{error.message}}
<ng-view></ng-view>
当出现拒绝访问错误时,ErrorMessageCtrl 将收到通知:
.controller('ErrorMessageCtrl', function ($scope) {
$scope.error = {}
$scope.$on('error:accessDenied', function(event, message) {
$scope.error.message = message
})
})
创建一个拦截器服务来处理 http 401 auth 错误:
.factory('authErrorInterceptor', function ($q, $rootScope) {
return {
response: function (response) {
return response
},
responseError: function(rejection) {
if (rejection.status === 401) {
$rootScope.$broadcast('error:accessDenied', 'Access Denied')
}
return $q.reject(rejection)
}
}
})
将拦截器服务添加到 $httpProvider
.config(function ($httpProvider, $routeProvider) {
$httpProvider.interceptors.push('authErrorInterceptor')
$routeProvider.when('/project/manhatten/security', {
template: '<div><h1>Secure Page</h1>secure data from server: {{data}}</div>',
controller: 'SecureDataCtrl'
})
})
$http.get('/api/some/secure/data') 返回 401 http 状态码
.controller('SecureDataCtrl', function ($scope, $http) {
$scope.data = 'none'
$http.get('/project/manhatten/security')
.success(function (data) {
$scope.data = 'secure data'
})
})
请记住,这是在 10 分钟内被黑客入侵的。你需要做一些重构。就像创建一个 errorMessage 指令,它会注入错误通知服务,而不是将错误消息广播到作用域。