AngularJs的授权布局



我正在使用Web API和AngularJs构建一个大型应用程序。我使用身份验证和基于声明的授权构建了安全的web api。一个要求是不同的用户可以在同一个模板上查看不同的模块。

我是AngularJs的新手。我用令牌在客户端进行了身份验证。此外,在webapi中,我创建了一个服务来获得给定用户id的所有权限。响应是一个资源(控制器)/操作(方法)对的列表。如何在客户端实现基于授权规则的正确布局?这仅仅依赖于web api权限响应和基于权限的显示/隐藏(ng-hide/ng-show)内容吗?

这是一个好方法吗?我还需要研究哪些其他模块/指令?例如在用户请求父路由之前不加载嵌套路由的加载器。

为了增加复杂性,这个网站还需要使用双语。我想翻译一下。我之所以提到这一点,是因为这可能会引发另一场讨论,即这是否有利于MVC而不是AngularJs。但是,如果以上两个问题都能解决,则首选Angular。

所有的身份验证&授权&验证应该在服务器端完成。您可以根据服务器告诉当前用户拥有的浏览器的角色/声明来调整用户界面。

实现这一点的一种方法是创建一个类似于角色/userprofile控制器的东西,该控制器将以当前用户拥有的角色列表作为响应。在客户端,你可能想要一些可以在任何地方注入的东西,这样你就可以确定用户界面的行为。

myApp.factory(‘myUser’, function(Roles, $q) {
// Create a promise to inform other folks when we’re done.
var defer = $q.defer();
// For this example I’m using ngResource
Role.query({
/*
No params — let the server figure out who you ‘really’ are.
Depending on WebApi configuration this might just be 
as simple as this.User (in context of the controller).
*/ 
}, function(roles) {
var user = {
roles: roles,
isInRole: function(role) {
return user.roles.indexOf(role) !== -1;
}
};
defer.resolve(user);
});
return defer;
});

因为上面的factory返回了一个promise,所以我们可以强制要求在创建某个路由/控制器实例之前解析myUser。我使用的一个小技巧是将所有路由定义收集在一个对象中,用angular.forEach循环遍历它们,并为每个对象添加resolve.myUser属性。您也可以使用它来预加载/初始化其他内容。

现在将myUser注入到您喜欢的任何位置:

myApp.controller(‘MyController’, function($scope, myUser) {
// Expose it on the current scope
$scope.myUser = myUser;
}); 

…在你的标记中…

<div class=“my-content-thingy”>
<p>Lorem del ipsum …</p>
<button class=“btn” ng-if=“myUser.isInRole(‘content-editor’)”></button>
</div>

注意:您可能希望使用ng-if而不是ng-show;后者将元素保持在DOM中。

请记住,您不会在客户端对任何进行身份验证;所有这些都在服务器端完成。一个简单的方法是将Authorize属性放置在适当的控制器操作上。

希望这能有所帮助。

一个合适的方法是在服务器上根据Authorization构建AngularJS路由配置。这应该在用户获得授权之后以及AngularJS应用程序初始化之前构建。这样,授权用户就可以根据自己的角色等看到一个"完整"的应用程序。使用ng show/ng hide不是一个好方法。此外,每个视图应该只做一件事。因此,根据需要完成的任务加载单独的视图。

关于多语言支持,这与授权无关。不久前,我编写了一个自定义AngularJS过滤器,该过滤器使用jQuery i18next插件。这是一个非常简单的实现。

但是您现在可以使用https://github.com/i18next/ng-i18next

(很抱歉误解了这个问题)。

我认为使用ng隐藏/显示不是什么大问题。最终,用户无法访问数据。我认为它应该依赖于api权限+展示/隐藏。取决于您想要的复杂性。。。您可以将MVC与angularjs一起使用,因为它是一个大型应用程序。

相关内容

  • 没有找到相关文章

最新更新