【问题标题】:AngularJS - permission directiveAngularJS - 权限指令
【发布时间】:2013-02-28 01:37:12
【问题描述】:

我正在尝试编写指令将评估用户权限

如果不允许用户查看给定的内容

  1. 内容不会显示(完成,工作正常)

  2. 来自权限指令内的控制器的请求将无法获得 被解雇了。

例子:

控制器:

function MyController ($scope){
     // performing imediately server request, witch is allowed only for admin
     // therefore i will get error when non admin user access this page
}

权限指令:

return {
        priority: 1000,
        restrict: 'E',
        link: (scope, element, attrs) => {
            var permission = attrs.permission;

            if (/*evaluating permission*/) { 
                // user has permission, no work for me
                return;
            }

            element.remove();
        }
    };

大家一起:

<permission permission="isAdmin">
    <div ng-controller="MyController">
    </div>
</permission>

这个版本正在从 DOM 中删除元素,但 MyController 中的请求仍然被执行。当然,我可以在 MyController 中检查权限,但我不想这样做。

感谢您的帮助。

【问题讨论】:

  • 请告诉我们您是如何处理您的 $http 请求的。
  • 或者做一个 jsfiddle。我想我知道你的问题是什么,但希望看到更多的代码来确定。
  • 2 Ray:这只是一个标准的 $http.post $http.post(address, data).success(succCall).error( errCall); jsfiddle 我不明白这有什么关系。我发现,在编译中删除元素是可行的,但我不确定它是否是好的解决方案。

标签: permissions angularjs user-permissions directive


【解决方案1】:

您的问题是控制器总是会在链接函数执行之前被调用。见this fiddle

function MyCtrl($scope) {
    console.log('in controller');
}

myApp.directive('permission', function() {
    return {
        restrict: 'E',
        link: function(scope, element, attrs) {
            console.log('in link');

日志显示:

in controller
in link

【讨论】:

  • 基于这个答案我尝试了另一种方法并将元素的删除放入 compile 函数中。根据日志,它是在控制器之前执行的,所以它是正确的地方。无论如何,请求仍然被解雇。因此,我尝试像盲拍一样删除元素子项(我知道,这没有意义,删除元素应该就足够了,也应该删除子项)。但它奏效了! compile: function(element) { var children = element.children(); children.remove(); element.remove(); } - 你对此有什么看法?它正在工作,但我不确定它有多好(例如未来版本的 Ang。)
  • @klesta, element.remove() 似乎在编译功能中对我有用:fiddle。如果我理解你的一般方法,它会有更大的问题,因为有人可以修改你的 JavaScript 并访问他们不应该访问的东西。
  • 他们可以修改它并查看例如管理部分,但他们不会被允许做任何事情,因为服务器不会让他们
  • (服务器甚至不会让他们获取他们无权访问的项目)
  • @klesta,好的,很好。我的(错误)印象是您要隐藏只有管理员才能看到的内容。
【解决方案2】:

我尝试了另一种方法并将删除元素放入编译函数中。根据日志,它是在控制器之前执行的,所以它是正确的地方。无论如何,请求仍然被解雇。因此,我尝试像盲拍一样删除元素子项(我知道,这没有意义,删除元素应该就足够了,也应该删除子项)。

但它奏效了!

compile: function(element) { var children = element.children(); children.remove(); element.remove(); }

它正在工作,但我不确定它有多好(例如未来版本的 Ang。)

【讨论】:

  • 我也遇到了同样的问题,能否请您发布整个代码?您是否以某种方式修改了链接功能,或者您只是在下面添加了这些行?
【解决方案3】:

如果我是你,我会调用服务器并检查它们是否被授权访问。

用指令来做这件事并没有什么意义。

指令通常用于操作 dom,这是授权确认通常应在控制器中处理,然后具有触发事件的结果。

然后让您的指令监听该事件并在他们从服务器获得访问权限时操纵 dom。

否则任何人都可以轻松地注入他们想要的任何内容并查看您的管理面板。

如果您不确定我的意思,请告诉我,如果您需要我可以扩展答案。

【讨论】:

  • 服务器端受到保护......当未经授权的用户提出请求时,会有“无权”之类的答案。对于相对简单的任务,您的方式看起来太费力了:)。控制器中不必要的权限代码。确定控件的用户权限的请求成倍增加......也许我没有做对。
  • -1 使用指令非常有意义。鉴于服务器已受到保护,您仍然需要根据权限在 UI 中隐藏/显示内容。使用指令使其方便是完全合适的。
  • 是的,我理解他的问题。我以为他只是想知道如何评估他的权限并没有意识到他只是指客户端。
猜你喜欢
  • 2014-06-06
  • 1970-01-01
  • 2016-03-31
  • 2017-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多