[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Система прав на сайте
Страницы: 1, 2
wollk
Здравствуйте ! Подскажите как лучше реализовать систему прав доступа к различным функциям.
Вот например есть такие функции: редактирование статьи, добавление статьи, удаление статьи, публикация комментария .......

Таких функций будет много - для гибкости системы. Думаю реализовать таблицу в БД, состоящая из колонок id (соответствует id пользователя) ну и одной колонки текстового формата acces:
id, access
1 0110111

В колонке id 0- нет доступа, 1 - есть доступ, ну, а какой по порядку символ строки 01110111 соответствует какой функции это уже не проблема реализовать.
Либо же сделать, чтобы для каждой функции право доступа хранилось в отдельной колонке, но тогда думаю будет много запросов к БД. Либо как посоветуете реализовать эти права ?
paul85
Я делаю один запрос при авторизации и складываю права в сессию. Как хранить ИМХО дело десятое. Я сделал через 3 таблицы. Одна таблица, естественно, сами пользователи. Вторая таблица возможные привилегии. И третья таблица - линковочная - из 2 столбцов: user_id, restriction_id.

Потом из сессии проверяю флаг, например, if($_SESSION['restrictions']['read_news'] === true) тогда идем дальше...
dron4ik
таблица
ид-пользователя, статус

таблица 2
статус, возвожности


или

таблица
ид-дользователя, возможности

не забываем при этом про дуфолдные значения

_____________
Ex3m.com.ua — Активный образ жизни
wollk
Тогда сделаю отдельную табличку с возможностями.
В таком случае лучше реализовать одну колонку, в которой хранить все права как строку из нулей и единиц.
Правда потом для выбора пользователей с определенными правами будет накладно.
kaww
wollk, строка нулей и единиц вам ничего не напоминает? Например двоичную сс? Почему бы не хранить в интах? и работать будет быстрее Правда в этом случае будет ограничение на количество хранимых правил 32 или 64 в зависимости от разрядности в одном поле.
wollk
Если int то это для каждого поля отдельную колонку в таблице, Ибо нет такого числа например
00001
kaww
Цитата (wollk @ 22.12.2013 - 15:47)
Если int то это для каждого поля отдельную колонку в таблице, Ибо нет такого числа например
00001

Как это нет? это 1.
Пример: Есть права 0101. В десятичном представлении это 5. Чтобы проверить третье правило:
var_dump(1 & (5 >> 2)); // result 1

Чтобы установить 4-е правило в 1:
var_dump(5| (1 << 3));



http://www.php.net/manual/ru/language.operators.bitwise.php
wollk
О, так вот как в вконтакте это реализовано
wollk
А не сильно ли накладно будет при редактировании прав, добавлению новых и т.п. ? И поиск в таком случае будет невозможен. Разве что по X записей в секунду обрабатывать и выводить в единую таблицу c помощью js.
kaww
wollk, А в каком именно месте будет накладно? битовые операции однозначно быстрее работы со строками.
Про поиск не совсем понял. базы данных битовые операции тоже умеют. вот mysql http://dev.mysql.com/doc/refman/5.0/en/bit-functions.html. как,с обственно, и javascript http://javascript.ru/bitwise-operators
wollk
Огромное спасибо, много нового узнал ! Именно так и буду делать.
bestxp
это ужастно неудобная система при условии если количество прав начнет расти (
wollk
Цитата (bestxp @ 23.12.2013 - 10:56)
это ужастно неудобная система при условии если количество прав начнет расти (

Вы предлагаете использовать строку 1001010 ? Либо в каждой колонке отдельное значение 1 0 1..... ?
bestxp
ну смотря к чему ты стремишься по данным

например
1 строка = 1 правило

например rbac реализация ( role based ) там правила привязаны к роле ( группе грубо говоря )

в acl нет посредника

имхо
wollk
Ну группы я буду использовать как шаблон с правами.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.