Трехуровневая структура разрешений веб-приложений с MySQL - PullRequest
1 голос
/ 07 февраля 2012

Прежде всего, я очень сожалею о том, как долго этот вопрос и ценим ваше время на его чтение!

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

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

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

По этим причинам нам необходимы трехуровневые разрешения, которые состоят из

  1. приложений, к которым пользователь может получить доступ
  2. отделов, к которым пользователь может получить доступ
  3. конкретные функции, к которым пользователь имеет доступ

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

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

В настоящее время мы опробовали системы с тремя таблицами, которые имеют следующие таблицы, относящиеся к разрешениям

Регистр приложений: содержит список всех приложений на платформе

    app_id (primary AI) | perm_id (int) | app_name | app_code | app_location | tab_location | access_key

Регистр разрешений для приложений: содержит список всех разрешений для каждого приложения, независимо от того, является ли оно приложением, отделом или функцией (определено в access_type ниже)

    permission_id (primary AI) | perm_id (int) | app_id | permission_code | permission_name | permission_description | access_type

Определенные пользовательские разрешения: это содержит определенные разрешения, которые относятся к приложению, отделу и функции

    permission_id (primary AI) | perm_id (varchar) | app_permission_id | app_id | user_id | access_status | function_code

Проблема возникает с назначением разрешений, как когда мы приступаем кНа уровне функций мы обнаружили, что запрос mySQL должен быть слишком конкретным для получения информации о доступе пользователя, и мы не можем получить полный список функций для этого отдела, значения NULL не возвращаются в LEFT JOIN, гдеони должны - это относится к определенному полю, которое имеет общее имя в нескольких таBles объединяются, но разные данные в каждом.Мы указываем все поля, которые мы хотим вернуть из каждого запроса, но по какой-то причине это 1 поле продолжает появляться, и неправильные данные объединяются.

Итак, я думаю о реализации следующей структуры:

Регистр приложений: для хранения списка всех приложений с URI и ссылкой на систему навигации

    app_id (primary AI) | app_name | app_uri | app_tab

Регистр отдела: для хранения списка всех отделов и связи с приложением

    dept_id (primary AI) | app_id | dept_name

Регистр функций: для хранения спискавсех функций и отношений с отделом, отдел в «реестре отделов» относится к приложению

   function_id (primary AI) | dept_id | function_name | function_description

Конкретные разрешения пользователя: для хранения списка всех функций пользователяможет выполнять, это связано с регистром функций, который связан с регистром отдела, который связан с регистром приложения

    permission_id (primary AI) | user_id (index) | function_id | permission_status (int - 0 = not allowed access | 1 = allowed access)

РЕДАКТИРОВАНИЕ СТАРТ

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

Я изменилсяОт function_id до permit_item для хранения идентификатора элемента, затем добавленного в permit_type, чтобы определить, является ли это приложение, отдел или функция, к которым пользователь имеет доступ.

    permission_id (primary AI) | user_id (index) | permit_item | permit_type | permission_status (int - 0 = not allowed access | 1 = allowed access)

EDIT END

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

    SELECT * FROM app_register 
    JOIN dept_register ON app.register.app_id=dept_register.app_id
    JOIN function_register ON dept_register.dept_id=function_register.dept_id
    JOIN user_permissions ON app_register.app_id=user_permissions.app_id
    WHERE user_permissions.user_id='1'

Это должно дать мне упрощенную объединенную таблицу разрешений, которая связывает все функции, отделы и приложения, а затем перечисляет, какие приложения пользовательимеет доступ к.

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

Есть ли что-то, на что я упустил из виду или на что слишком усердно смотрел?

Есть ли еще одна лучшая структура, которую мы можем попробовать, чтобы вы могли обработать эти данные?

Я очень признателен всем за помощь и еще раз извиняюсь за длину этого вопроса!

1 Ответ

0 голосов
/ 07 февраля 2012

Ваше предложенное решение кажется наиболее разумным для меня.

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

яблоки: [id, марка, органика] бренды: [id, name]

станет:

app_apples: [app_id, appbrd_brand, app_organic] brd_brands: [brd_id, brd_name]

Это выполняет две вещи. Каждое поле гарантированно должно быть уникальным во всей системе (таким образом, оно должно разрешать все JOIN проблемы), и что связи между данными также можно увидеть и разрешить очень быстро.

Только мои два цента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...