Каковы лучшие практики вокруг авторизации списка ресурса?

Я думаю, что вы задумаетесь над проблемой. Что значит найти максимум массива? Чтобы иметь начальное значение и сравнить его с каждым значением из массива . Если больше , то вы обновите максимальное значение , найденное до сих пор. Если нет, вы ничего не делаете. В конце концов, вы на 100% уверены, что переменная содержит самое большое значение в вашем массиве.

В приведенном ниже коде я инициализировал max до нуля. Если массив пуст, я просто возвращаю max как ноль. Это просто соглашение, которое я сделал, вы можете удалить его, если собираетесь проверять только массивы хотя бы с одним элементом или возвращать что-то еще, если массив пуст.

Далее, если это условие выполнено, это означает, что у меня есть хотя бы один элемент в массиве, поэтому я могу инициализировать max (пока) с первым элементом. Теперь мне нужно только сравнить максимальное значение с другими n - 1 элементами в массиве и обновить максимальное, если это необходимо.

Иногда другие реализации инициализируют максимальное значение с помощью Number.MIN_VALUE. Почему мин? Так что каждое значение в вашем массиве больше этого значения, и вы можете начать итерацию с i = 0; однако, это не работает, если ваш массив имеет Number.MIN_VALUE как элемент.

function findMax(myArray) {
  let len = myArray.length;
  let max = null;
  
  if (len === 0)
    return max;
    
  max = myArray[0];
  
  for (var i = 1; i < len; i++) {
    if (myArray[i] > max)
      max = myArray[i];
  }
  
  return max;
}

let arr = [1, 3, 4, -2, -4, 8, 16, 0, -18, 6];
let empty = [];

console.log(findMax(arr));
console.log(findMax(empty));

Бонус : В javascript также есть несколько интересных вещей, называемых лямбда-функциями. Одним из них является редуктор . Метод redu () выполняет функцию редуктора (которую вы предоставляете) для каждого члена массива, в результате чего получается одно выходное значение. Он работает примерно так же, но он более элегантный и компактный. a является аккумулятором, а e является текущим элементом. Мы просто сравниваем a с e и сохраняем наибольшее значение. Второй параметр (null является начальным значением, как я объяснил ранее). Реализация Math.max с помощью Reduce очень проста:

function findMax(array) {
  return array.reduce((a, e) => a > e ? a : e, null);
}

let arr = [1, 3, 4, -2, -4, 8, 16, 0, -18, 6];
let empty = [];

console.log(findMax(arr));
console.log(findMax(empty));

5
задан warren 26 November 2008 в 18:19
поделиться

3 ответа

Можно интересоваться чтением этой статьи Steffen Bartsch. Это суммирует все плагины авторизации для Ruby on Rails, и я уверен, что это поможет Вам найти свое решение (хотя эта статья о плагинах направляющих, понятия являются легко экспортными внешними направляющими).

Steffen также создал свой собственный плагин, названный "Декларативная Авторизация", которая, кажется, соответствует Вашим потребностям, по моему скромному мнению:

  • с одной стороны, Вы определяете роли (такие как "посетитель", "администратор"...). Ваши пользователи связаны с этими ролями (в many-many отношениях). Вы отображаете эти роли на полномочия (снова в many-many отношениях). Каждое полномочие связано с данным контекстом. Например, роль "посетитель" может иметь полномочие "документы чтения". В этом примере "читайте", полномочие, и это применяется к контексту "документов".
    • Примечание: в плагине Steffen можно определить иерархию ролей. Например, Вы могли бы хотеть иметь "global_admin" роль, включают "document_admin" роль, а также "comment_admin" роль, и т.д.
    • Вы можете также определять иерархии полномочий: например, "управлять" полномочие могло включать "чтение", "обновить", "добавить" и "удалить" полномочия.
  • с другой стороны, Вы кодируете свое приложение, думающее с точки зрения полномочий и контекстов, не с точки зрения ролей. Например, действие для отображения документа должно только проверить, есть ли у пользователя полномочие "читать" в контексте "документов" (никакая потребность проверить, есть ли у пользователя роль "посетителя" или любая другая роль). Это значительно упрощает Ваш код, так как большая часть логики авторизации извлечена в другом месте (и возможно даже определена кем-то еще).

Это разделение между определением пользовательских ролей и определением полномочий прикладного уровня гарантирует, что Ваш код не изменится каждый раз, когда Вы определяете новую роль. Например, вот то, как простой контроль доступа был бы похож в контроллере:

class DocumentController [...]
  filter_access_to :display, :require => :read
  def display
    ...
  end
end

И в представлении:

<html> [...]
  <% permitted_to?(:create, :documents) do %>
  <%= link_to 'New', new_document_path %>
  <% end %>
</html>

Плагин Steffen также допускает уровень объектов (т.е. уровень строки) контроль доступа. Например, Вы могли бы хотеть определить роль, такую как "document_author" и дать его, "управляют" полномочием на "документах", но только если пользователь является автором документа. Объявление этого правила было бы, вероятно, похоже на это:

role :document_author do
  has_permission.on :documents do
    to :manage
    if_attribute :author => is {user}
  end
end

Вот и все! Можно теперь получить все документы, которые пользователю разрешают обновить как это:

Document.with_permissions_to(:update)

Так как "управлять" полномочие включает полномочие "обновления", это возвратит список документов, автор которых является текущим пользователем.

Конечно, не для каждого приложения будет нужен этот уровень гибкости..., но Вашего сила.

5
ответ дан 14 December 2019 в 19:30
поделиться

У меня обычно есть схема как это

Пользовательские документы −−  UserDocuments  −−

Затем я создаю представление "ProfiledDocuments"

SELECT <fields> 
FROM Documents d 
INNER JOIN UserDocuments ud on ud.DocumentId = d.Id 
INNER JOIN Users u ON u.Id = ud.UserId

Затем выполните поисковые запросы на ProfiledDocuments всегда с помощью фильтра UserId. С соответствующими индексами это работает достаточно хорошо.

При необходимости в более сложных полномочиях можно сделать это с дополнительным полем в UserDocuments, который многие многим представляют в виде таблицы, который указывает вид разрешения.

0
ответ дан 14 December 2019 в 19:30
поделиться

Хотя Ваш вопрос вполне разрабатывается, существует на самом деле некоторый недостающий контекст.
Что определяет документы, для которых у пользователя есть полномочия? Пользователь может только отредактировать свои "собственные" файлы? Здесь существует ли основанный на роли механизм? Это более ориентировано на MAC (т.е. пользователь видит уровень безопасности)? Существует ли атрибут определения к данным (например, отдел)?

Все эти вопросы вместе могут дать лучшее изображение и позволить более определенный ответ.

Если документы "принадлежат" определенному пользователю, его довольно простые - имеют поле "владельца" для документа. Затем запросите для всех документов, принадлежавших пользователю.
Точно так же, если можно предопределить список именованных пользователей (или роли), которые имеют доступ, можно запросить для списка, к которому присоединяются, между документами, списка авторизованных пользователей/ролей и пользователя (или его роли).
Если пользователь получает полномочия по данным своего отдела (или атрибут другого аналогичного документа), можно запросить на этом.
Точно так же можно запросить для всех документов с уровнем равной безопасности или понизиться к уровню полномочий пользователя. Если это - динамический рабочий процесс, каждый документ должен обычно отмечаться с его текущим состоянием и/или затем ожидал шаг; какие пользователи могут выполнить, тот следующий шаг является просто другим полномочием/ролью (рассматривайте то же как выше).
Затем конечно, Вы захотите сделать ОБЪЕДИНЕНИЕ ВСЕ между всеми теми и общедоступными документами...

Btw, если я не прояснил, это не простая проблема - делают себе одолжение и находят, что предварительно созданная инфраструктура делает это для Вас. Даже за счет упрощения Ваших схем авторизации.

0
ответ дан 14 December 2019 в 19:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: