Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Распределение прав
Форумы портала PHP.SU » Серверное администрирование » Администрирование БД » Распределение прав

Страниц (1): [1]
 

1. pantela - 17 Октября, 2017 - 19:37:00 - перейти к сообщению
Есть проект где много страниц и функции, надо сделать распределение прав. для пользователей.
В БД имею след. архитектуру таблиц:
users - список пользователей
roles - список групп
roles_users - Какие группы у пользователя (связка идёт виде users.id = roles.id)

Теперь я беру в таблицу "roles" делабю товые поля и там прописываю напр. "news_list", "news_add", "news_remove" и присваиваю для группы "0" или "1", та ки определяю должна функция быть доступна или нет...

Но вопрос в том что у меня много страниц и функции и все загонять в таблиц roles виде полей не приятно...

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

Спс.

CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE IF NOT EXISTS `roles` (
  2.   `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  3.   `name` varchar(32) NOT NULL,
  4.   `description` varchar(255) NOT NULL,
  5.   PRIMARY KEY  (`id`),
  6.   UNIQUE KEY `uniq_name` (`name`)
  7. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
  8.  
  9. INSERT INTO `roles` (`id`, `name`, `description`) VALUES(1, 'login', 'Login privileges, granted after account confirmation');
  10. INSERT INTO `roles` (`id`, `name`, `description`) VALUES(2, 'admin', 'Administrative user, has access to everything.');
  11.  
  12. CREATE TABLE IF NOT EXISTS `roles_users` (
  13.   `user_id` int(10) UNSIGNED NOT NULL,
  14.   `role_id` int(10) UNSIGNED NOT NULL,
  15.   PRIMARY KEY  (`user_id`,`role_id`),
  16.   KEY `fk_role_id` (`role_id`)
  17. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  18.  
  19. CREATE TABLE IF NOT EXISTS `users` (
  20.   `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  21.   `email` varchar(254) NOT NULL,
  22.   `username` varchar(32) NOT NULL DEFAULT '',
  23.   `password` varchar(64) NOT NULL,
  24.   `logins` int(10) UNSIGNED NOT NULL DEFAULT '0',
  25.   `last_login` int(10) UNSIGNED,
  26.   PRIMARY KEY  (`id`),
  27.   UNIQUE KEY `uniq_username` (`username`),
  28.   UNIQUE KEY `uniq_email` (`email`)
  29. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
  30.  
  31. CREATE TABLE IF NOT EXISTS `user_tokens` (
  32.   `id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  33.   `user_id` int(11) UNSIGNED NOT NULL,
  34.   `user_agent` varchar(40) NOT NULL,
  35.   `token` varchar(40) NOT NULL,
  36.   `type` varchar(100) NOT NULL,
  37.   `created` int(10) UNSIGNED NOT NULL,
  38.   `expires` int(10) UNSIGNED NOT NULL,
  39.   PRIMARY KEY  (`id`),
  40.   UNIQUE KEY `uniq_token` (`token`),
  41.   KEY `fk_user_id` (`user_id`)
  42. ) ENGINE=InnoDB  DEFAULT CHARSET=utf8;
  43.  
  44. ALTER TABLE `roles_users`
  45.   ADD CONSTRAINT `roles_users_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE,
  46.   ADD CONSTRAINT `roles_users_ibfk_2` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`) ON DELETE CASCADE;
  47.  
  48. ALTER TABLE `user_tokens`
  49.   ADD CONSTRAINT `user_tokens_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE;
2. Sail - 18 Октября, 2017 - 22:27:29 - перейти к сообщению
pantela пишет:
Но вопрос в том что у меня много страниц и функции и все загонять в таблиц roles виде полей не приятно...

На этот случай есть связь "многие-ко-многим". Иными словами - "таблица связей".
Ведь используете roles_users. Тут ведь тоже не одна роль у пользователя, как и не один пользователь у роли может быть. Улыбка
А ещё права можно не только группе давать, но и пользователю.
Отсюда - ещё одна таблица соответствия пользователей правам доступа.
3. pantela - 19 Октября, 2017 - 12:32:57 - перейти к сообщению
Как я понял по вашим словам если я создавал поля как права, мне надо будет создавать записи, т.е. елси запись права есть у пользователя тогда дать ему доступ... как-то так...?
4. Sail - 20 Октября, 2017 - 23:07:27 - перейти к сообщению
pantela пишет:
Как я понял по вашим словам если я создавал поля как права, мне надо будет создавать записи, т.е. елси запись права есть у пользователя тогда дать ему доступ... как-то так...?

Да, как-то так.
Или пользователю, или группе, или и тому и другому и можно без масла
Или можно набор прав как битовую маску в UINT хранить... и при обращении - побитовые операции использовать.
5. LIME - 21 Октября, 2017 - 00:40:03 - перейти к сообщению
Sail пишет:
Или можно набор прав как битовую маску в UINT хранить... и при обращении - побитовые операции использовать.
или проще SET использовать, который и есть по сути битовая маска только не надо битовые операции мучать

 

Powered by ExBB FM 1.0 RC1