Как разграничить доступ к информации в многопользовательской системе?
Добрый день!
В процессе проектирования столкнулся с проблемой.
Имеется система контроля доступа.
В ней есть сущности:
- пользователь (ФИО, телефон, email),
- карточка доступа (номер карточки, период действия),
- организация,
- должность пользователя.
Пользователь может не иметь должностей или иметь должности в одной или нескольких организациях.
У пользователя может быть несколько карточек доступа.
Для людей, контролирующих систему контроля доступа (назовем их менеджеры) есть разграничение доступа к информации касательно организации, данные по которое они могут видеть.
Например:
- пользователь user1 имеет должность в организации org1,
- для проходов в org1 он использует карточку card1 (но кроме этого еще имеет карточки card2 и card3,
однако они не используются в данной организации)
- manager1 (который заведует организацией org1) может видеть данные пользователя user1
(ФИО, телефон, email и данные по карточке card1, т.к. она привязана к доступу в org1).
При этом база пользователей с их картами подгружается в систему в самом начале, т.е. когда менеджеры
начинают добавлять должности по своим организациям, то это накладывается на уже имеющихся пользователей.
При приеме на работу и добавлении должности мне нужно найти нужного человека в БД по ФИО (при этом если пользователей несколько с одинаковыми данными, то я увижу их несколько)
При добавлении карточки пользователя в контроль доступа мне нужно ввести номер карты и убедиться что она принадлежит правильному пользователю.
Однако тут возникают проблемы, связанные с тем как защитить личные данные пользователя от того чтобы их не могли просматривать любые менеджеры из разных организаций введя только ФИО.
Т.е. данные вроде как должны быть и в единой большой базе, но в то же время и полностью доступны.
Была идея некой вышестоящей должности и полными правами доступа ко всему и чтобы он открывал доступ к информации по тому или иному пользователю для принятия их на работу в ту или иную организацию. Но это не совсем удобно.
Больше идей по тому как организовать ограниченный доступ нет, есть мысль что в крайнем случае можно просто не отображать полные данные пользователя (например, только последние N букв и цифр его email-а и пароля, которых будет достаточно для того чтобы уникально идентифицировать того ли мы человека принимаем на работу или его однофамильца).
Буду рад любой помощи, любым подсказкам и ссылкам в какую сторону посмотреть, что почитать.
P.S. Прошу простить если не совсем корректно указал теги, не придумал куда лучше отнести данный вопрос.
Однако тут возникают проблемы, связанные с тем как защитить личные данные пользователя от того чтобы их не могли просматривать любые менеджеры из разных организаций введя только ФИО.
Система должна выводить список только тех людей, которые относятся к организации, в которой работает данный менеджер.
Александр, проблема как раз в том случае когда пользователя нужно принять на работу и он пока не числиться в той организации. Т.е. он пока есть в общей базе пользователей, но нет никаких привязок к данной организации.
Александр, дело в том что все люди находятся в единой базе и проследить их связь с той или иной организации можно только после того как данный человек будет принят на работу, т.е. появиться запись в отдельной таблице, которая свяжет вместе user_id и position_id.
При добавлении нового сотрудника менеджер должен иметь возможность ввести ФИО и потом ему будет выведен наиболее подходящий человек из общей базы, однако с одинаковыми ФИО может быть несколько человек. Т.е. менеджер будет иметь фактически доступ к личным данным нескольких человек, сможет их посмотреть, чего хотелось бы избежать, хотелось бы дать менеджеру доступ только к одному конкретному человеку и никаких шагов влево-вправо.
Вот у меня пока непонимание как обеспечить данное ограничение.
Если расследовать случаи "лазанья по базе" постфактум и если бы у меня был некий уникальный идентификатор пользователя типа номера паспорта или идентификационного кода, то можно было бы сделать чтобы при приеме на работу менеджер для поиска использовал данный код и по нему однозначно находился бы один уникальный человек. А дальше уже можно было бы дописать логику, которая будет отслеживать по статистике запросов в базу что менеджер производил поиск номеров, которые ему не нужны были, т.е. эти люди не были приняты на работу и таким образом понимать что менеджер злоупотребляет доступом к базе.
Насколько я понимаю, в некоторых банках это все работает подобным образом, т.к. работники банка имеют возможность посмотреть информацию по разным пользователям (не только тем, с которыми они работают), но опасаются это делать, т.к. потом служба безопасности задает им вопросы относительно того зачем им была нужна информация по тем или иным пользователям если они их не обслуживают.
Пусть менеджер сам заводит этого человека для организации.
Система может сопоставить уникальную информацию типа ИНН, и связать человека с общей базой.
Т.о. менеджер не будет иметь "выбора" личностей из общего списка
Пусть менеджер сам заводит этого человека для организации.
Система может сопоставить уникальную информацию типа ИНН, и связать человека с общей базой.
Т.о. менеджер не будет иметь "выбора" личностей из общего списка