2013-03-12 5 views
9

Я пытаюсь написать директиву что будет оценивать права пользователя.AngularJS - директива разрешения

В случае, если пользователь не разрешается видеть данное содержание

  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, но я не хочу этого делать.

Благодарим за помощь.

+0

Пожалуйста, покажите нам, как вы делаете ваш запрос $ HTTP. –

+0

или сделать jsfiddle. Думаю, я знаю, в чем проблема, но вы хотите, чтобы больше узнать о своем коде. –

+0

2 Ray: это стандартная $ http.post '$ http.post (адрес, данные) .success (succCall) .error (errCall);' [jsfiddle] (http://jsfiddle.net/sdYgp/2/) Я не вижу, как это уместно. Я выяснил, что удаление элемента в компиляции работает, но я не уверен, что это хорошее решение. – klesta

ответ

1

Я попробовал другой подход и поместить удаление элемента в функции компиляции. Согласно журналу, он выполняется до контроллера, поэтому он правильный. Во всяком случае, запрос все еще был уволен. Поэтому я старался, чтобы слепой выстрел удалял дочерние элементы (я знаю, это не имеет смысла, удаление элемента должно быть достаточным и должно также удалять детей).

Но это сработало!

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

Это работает, но я не уверен, насколько это нормально (например, будущая версия Ang.)

+0

Я столкнулся с той же проблемой, можете ли вы отправить весь код ?. Вы каким-то образом изменили функцию связи, или вы просто добавили эти строки внизу? –

-1

Если бы я был вами, я хотел бы позвонить на сервер и проверить, разрешены ли они для доступа.

Выполнение этого с помощью директивы на самом деле не имеет смысла.

Директивы, как правило, предназначены для манипуляции с dom, и это подтверждение авторизации обычно должно выполняться в контроллере, а затем результат этого триггера события.

Затем ваша директива будет прослушивать это событие и управлять им, если они получают доступ с сервера.

В противном случае любой человек может просто просто ввести все, что захочет, и увидеть панель администратора.

Если вы не уверены, что я имею в виду, дайте мне знать, я могу расширить ответ, если вам нужно.

+0

хорошо серверная сторона защищена ... когда неавторизованный пользователь делает запрос, есть ответы типа «нет прав». Ваш путь выглядит слишком много для относительно простой задачи :). Ненужный код разрешения в контроллерах. Множественный запрос для определения прав пользователей для элементов управления ... Возможно, я не понимаю. – klesta

+0

-1 Использование директивы имеет смысл. Учитывая, что сервер защищен, вам все равно нужно скрывать/показывать вещи в пользовательском интерфейсе на основе привилегий. Использование директивы, чтобы сделать ее удобной, вполне уместно. –

+0

Yup mis понял его вопрос. Я думал, что он просто хотел знать, как оценить его разрешения, не понимал, что он имеет в виду только клиентскую сторону. –

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 
+0

Основываясь на этом ответе, я попробовал другой подход и поместил удаление элемента в функцию ** компиляции **. Согласно журналу, он выполняется до контроллера, поэтому он правильный. Во всяком случае, запрос все еще был уволен. Поэтому я старался, чтобы слепой выстрел удалял дочерние элементы (я знаю, это не имеет смысла, удаление элемента должно быть достаточным и должно также удалять детей). Но это сработало! 'compile: function (element) {var children = element.children(); children.remove(); element.remove(); } '- что вы говорите по этому поводу? Он работает, но я не уверен, насколько это хорошо (например, будущая версия Ang.) – klesta

+0

@klesta, element.remove(), похоже, работает для меня в функции компиляции: [скрипка] (http: // jsfiddle. сеть/mrajcok/MFHet/2 /). Если я понимаю ваш общий подход, у него большие проблемы, потому что кто-то может изменить ваш JavaScript и получить доступ к вещам, к которым у них не должно быть доступа. –

+0

ну, они могут изменить его и посмотреть, например, раздел admin, но им не разрешат ничего делать, поскольку сервер не позволит им – klesta