在定义AngularJS应用程序的路由时,为了指示每个路由应具有的访问级别,每个路由都添加了一个名为access
的新属性。这基于here所述的客户端授权方法。
.config
块如下所示:
app.config(['$routeProvider', '$locationProvider', '$httpProvider',
function ($routeProvider, $locationProvider, $httpProvider) {
var access = routingConfig.accessLevels; //Initialize with asynch data instead
$routeProvider.
when('/home', {
templateUrl: '/Templates/home.html',
controller: 'homeController',
access: access.user
});
$routeProvider.
when('/private', {
templateUrl: '/Templates/private.html',
controller: 'adminController',
access: access.admin
});
//...more route configurations
}]);
将该方法的核心逻辑放在一边,我只想知道如何用一些异步数据初始化access
变量,以便在为每个变量定义access
属性时可用它路线?这是必需的,因为只有服务器知道访问级别列表。
虽然Initialize AngularJS service with asynchronous data的答案基于在服务中公开promise
&在路由配置中使用resolve
,它在我的情况下不起作用,因为我需要在定义路由配置之前解析异步调用,因为access
属性依赖于异步数据。
我有哪些选择? promise/deferred方法是否仍可以某种方式使用?
任何建议都会非常感激。
编辑:
为了描述access
正在做些什么,它由一个名为routingConfig
的单独模块填充。在approach中,用户可以属于某个角色,该角色被定义为二进制数。例如,public:001,user:010,admin:100(依此类推)。
任何路由的访问级别将再次是由允许访问它的所有用户角色的OR操作定义的二进制数。因此对于例如如果用户角色user
(010)和user
(100)可以访问admin
访问级别,则其位掩码将为110.稍后检查路由上的访问权限,我们可以对用户角色和访问级别执行AND操作以查看它是否已获得授权。详情见上述链接。
请注意,服务器端的数据仍然是更复杂的算法,因此即使在客户端操作上述逻辑,这样的用户也只能看到任何未授权页面的标记。 / p>
再次回到手头的问题。如何使用来自服务器的异步数据初始化access
块中用作config
块中的属性的accessLevels : {
'public' : '111',
'user' : '110',
'admin': '100'
}
。此数据可能如下所示:
{{1}}
答案 0 :(得分:2)
因此,如果我理解正确,应用程序应该无响应,直到access
可用。那么,异步获取access
是什么意思呢?
也许这种方法是合适的[在很多类似的情况下肯定应该是]:
<script src="angular.js"></script>
<script>
angular.module('config').constant(
<%= // JSON.stringify your config and access %>
);
</script>
<script src="app.js"></script>
如果你真的必须异步完成,那么使用XHRHttpRequest
或其他方式手动抓取你的应用程序access
和bootstrap
。
答案 1 :(得分:0)
不确定你是否在此期间解决了问题,但我前段时间遇到了同样的问题。我的解决方案是使用html
标记上的主控制器和ng-app
。在控制器内部,我使用从我的服务器接收的访问级别数据,并在$route
的帮助下在那里定义了我的路由。因此,在定义路由配置之前,可以访问数据。您当然也可以从控制器内的then
工厂调用promise Auth
函数,并在那里定义您的路由。
视图:
<html ng-app="app" ng-controller="MainController">
...
</html>
控制器:
var MainController = ['$scope', '$http', '$route', 'Auth', function ($scope, $http, $route, Auth) {
var accessLevels = Auth.accessLevels;
$route.routes['/index'] = {templateUrl: "pages/index", controller: IndexController, access: accessLevels.guest};
....
$route.routes['null'] = {redirectTo: '/index', controller: IndexController};