Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Схема таблиц для авторизации 
:(
    Опции темы
ksnk
Дата 8.5.2008, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Как-то неотвратимо и неторопясь пришла необходимось переписать систему авторизации. Вот какие мысли в голове забродили... Пока на уровне мыслей, до кода не очень далеко, но его пока нет ;-)

Авторизация
Список решаемых задач
Система авторизации предназначена для 
•    разграничения доступа к контенту по логину-паролю.
•    Обеспечения поддержки/запрета множественного(с разных компьютеров) входа одного пользователя.
•    Выяснение количества пользователей в online.
•    наследование прав пользователей по группам и индивидуально
Структура mySql таблицы для поддержки системы авторизации
-
Код

- 
-- Структура таблицы `user`
-- 

CREATE TABLE `user` (
  `id` int(11) NOT NULL default '0',
  `name` varchar(50) NOT NULL default '',
  `ival` int(11) NOT NULL default '0',
  `dval` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `sval` varchar(255) NOT NULL default '',
  `tval` text NOT NULL,
  PRIMARY KEY  (`id`,`name`,`ival`,`sval`),
  KEY `dval` (`dval`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;



В рамках этой таблицы формируются записи о пользователях и группах. Для каждого пользователя/группы заводится идентификатор и несколько записей со свойствами пользователя/группы. Список параметров (name) фиксирован в рамках одного проекта, но может быть расширен на любые требуемые рамки. Значения ival, tval, sval и dval определяются по смыслу параметра name.

В дальнейшем каждую строчку таблицы вида (ID, name) будем называть параметром `name` пользователя `ID`.

Возможный список имен параметров:
User – имя пользователя
Group – имя группы. Эти параметры не могут встречаться для одного и того-же ID’а, хотя нужно подумать над этой возможностью. Пока Group служит только контейнером для наследуемых прав

Link - Подключение пользователя к группе ival
Password – пароль пользователя для входа
Right – права пользователя/группы.
cRight – вычисленные права, с соблюдением наследования.

Хранение прав пользователей.
В параметре right хранится 2 ассоциативных массива allow и deny, соответственно с разрешениями и запрещениями для данного ID.
Алгоритм идентификации
Для входящей пары логин-пароль производится поиск в базе всех параметров user со значением «логин» и паролем.
Примерный запрос
Код

SELECT `id`
FROM user LEFT JOIN user AS u1 ON id = u1.id
WHERE `name`='user' AND ` sval`="$user" AND `u1.name`='password' AND `u1.sval`="$password";


Вход в систему оформляется вставкой параметра
ID,’Online’, sval=SessionId–соответствующая сессия. Dval-дата входа систему, tval – сопроводительная информация. (REMOTE_IP, X-FORVARDED_FOR, ets…)
Подтверждение входа.
Идентификатор пользователя сохраняется в сессии. При повторном визите зарегистрированного пользователя производится сравнение значения ID-сессии в параметре online пользователя и, возможно, сравнение сопроводительной информации.
При несовпадении пользователь считается незарегистрированным.
Выяснение количества пользователей в online
После входа, для пользователя заводится параметр online с датой входа. Количество пользователей в online – количество соответствующих параметров в базе, имеющих дату не позднее, чем 10 минут назад.
Наследование прав пользователей по группам и индивидуально
Права пользователя находятся в параметре cRight. В случае, если параметр не установлен - выполняется перевычисление прав. В случае, если пользователь наследует только одному ID, права берутся непосредственно оттуда. Если схема наследования сложнее – права пере вычисляются и сохранятся в параметре cRight 

Перевычисление прав
После установки индивидуальных прав для какого либо ID должны быть перевычислены соответствующие ему cRight.
Используется рекурсивный алгоритм: начиная с ID очищаем все права, зависимые от него (id?,‘link’ ,ival =ID)=>delete(id?,’cRight’). Для каждого найденного id? Очистка повторяется.
Предлагаемая ниже схема работает для случая ненаследуемых друг от друга групп.

После входа пользователя в систему производится поиск параметра right для этого пользователя. Затем выполняется поиск параметров link и соответствующих cRight для линкованных сущностей. Права сущностей объединяются обычным OR’ом. После чего права склеиваются с индивидуальными правами.

Переустановленные индивидуальные права сохраняются в параметре right. После установки прав необходимо перевычислить права и поместить композитные права в параметр cRight. После этого необходимо удалить все зависимые (id?,’link’,ival=ID) от этого ID cRight, что вызовет перевычисление их при необходимости.

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


Это сообщение отредактировал(а) ksnk - 8.5.2008, 12:36


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Fortop
Дата 8.5.2008, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 3
Всего: 42



ksnk, 
Не понял, ты хочешь хранить список коннектов и права пользователей в одной таблице?

Добавлено через 3 минуты и 30 секунд
Я бы сделал как минимум две.
Таблица подключений пользователей/групп (вот тут ты хранишь ид текущей сессии, вычисленные права и т.д.)
Таблица пользователей/групп.

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

Добавлено через 4 минуты и 13 секунд
Естественно, что при таком подходе группа может содержать в себе группы.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
ksnk
Дата 8.5.2008, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Цитата(Fortop @  8.5.2008,  11:59 Найти цитируемый пост)
Не понял, ты хочешь хранить список коннектов и права пользователей в одной таблице?

Дык! Лозунг "все в одном" живет и побеждает. Просто таблица коннектов получилась примерно такой-же структуры, так что мне захотелось их объединить... разве что с точки зрения безопасности (таблица на диске сточится и покрошится с большей вероятностью ;-) ) можно бы их разнести, да и оптимизровать ее придется почаще, ... но пока - не хочу...
Цитата(Fortop @  8.5.2008,  11:59 Найти цитируемый пост)
Естественно, что при таком подходе группа может содержать в себе группы. 

Дык! За это в основном и велась борьба. Хотелось полное наследование от вложеных "деревянно" друг в друга групп...



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Fortop
Дата 8.5.2008, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 3
Всего: 42



Цитата(ksnk @  8.5.2008,  12:33 Найти цитируемый пост)
Просто таблица коннектов получилась примерно такой-же структуры, так что мне захотелось их объединить...

У меня какое-то внутреннее предубеждение насчет хранения динамических/временных данных и справочников в одной таблице.

Таблица прав это справочник. А ты фактически при каждом коннекте будешь его дергать запросом на обновление.

С другой стороны таблица активных коннектов - это по-сути временная таблица.

Вот кстати и причина сделать ее отдельно. Число пользователей может быть достаточно большим. А активных коннектов - все же меньше.
Поэтому для активных подключений можно выбрать другой тип таблицы (Memory) например.

Цитата(ksnk @  8.5.2008,  11:45 Найти цитируемый пост)
Права сущностей объединяются обычным OR’ом. После чего права склеиваются с индивидуальными правами.

И еще, поясни вот эту цитату. На пальцах, если можно. У группы есть разрешение на редактирование, а у конкретного пользователя принадлежащего этой группе стоит запрет на редактирование.
Какое право он получит в твоем варианте?

Мне кажется стоит пользоваться И, вместо ИЛИ. Т.е. все что не разрешено - запрещено.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
ksnk
Дата 8.5.2008, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Цитата(Fortop @  8.5.2008,  13:50 Найти цитируемый пост)
И еще, поясни вот эту цитату.

Ну, как я пока себе представляю - права юзера - два ассоциативных массива allow и deny. Выглядят они, с точки зрения пользования, как-нибудь так:

Код

user->set_Right(
  array( 'news'=>right_READA+right_WRITE+right_ADMIN,
            'spam'=>right_DELETE+right_ADMIN) // allow
  array('spam'=>right_WRITE) // deny
);

default_Group->set_Right(array('*'=>right_READ))

Скомпилированные права - объединение всех непересекающихся полей в массивах. Пересекающиеся поля одного уровня (первые "группы-предки" цепочки наследования) объединяются простым OR'ом. Сливать собственные поля с наследуемыми нужно более экзотично... У меня пока вот так
Код

/**
 *  подклеить права к объекту
 *   более частные права подклеиваются к более общим
 *   разрешение/запрет на частном бьет запрет/разрешение  на общем...
 */
    function apply_rights($allow,$deny)
    {
        foreach($allow as $k=>$v) {
            $this->allow[$k]=(ppi($this->allow[$k])&& (~ppi($deny[$k]))) || $v;
        }
        foreach($deny as $k=>$v) {
            $this->deny[$k]=(ppi($this->deny[$k])&& (~ppi($allow[$k]))) || $v;
        }
    }
}


Хотя до проверки всего этого добра я не добрался ;-)

Это сообщение отредактировал(а) ksnk - 8.5.2008, 15:53


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Fortop
Дата 8.5.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 3
Всего: 42



Цитата(ksnk @  8.5.2008,  15:41 Найти цитируемый пост)
Пересекающиеся поля одного уровня (первые "группы-предки" цепочки наследования) объединяются простым OR'ом. Сливать собственные поля с наследуемыми нужно более экзотично...

ок, спасибо smile


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0709 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.