cotonti.com : дожились? или права пользователей https://www.cotonti.com Laatste forum onderwerpen Cotonti en Mon, 06 Oct 2025 21:03:40 -0000 esclkm Za, 06 Feb 2010 02:50:04 -0000 Trustmaster Za, 06 Feb 2010 02:39:41 -0000 esclkm реально ясность наступила.

Добавлено 15 Минут спустя:

еще наглдяднее к ясности стало после такой таблицы:
+------------+-------------------------------------+-------------+
| HEX | BIN | DEC |
+------------+-------------------------------------+-------------+
| 0x00000001 | 00000000 00000000 00000000 00000001 | 1 |
| 0x00000002 | 00000000 00000000 00000000 00000010 | 2 |
| 0x00000004 | 00000000 00000000 00000000 00000100 | 4 |
| 0x00000008 | 00000000 00000000 00000000 00001000 | 8 |
| 0x00000010 | 00000000 00000000 00000000 00010000 | 16 |
| 0x00000020 | 00000000 00000000 00000000 00100000 | 32 |
| 0x00000040 | 00000000 00000000 00000000 01000000 | 64 |
| 0x00000080 | 00000000 00000000 00000000 10000000 | 128 |
| 0x00000100 | 00000000 00000000 00000001 00000000 | 256 | 

но табица прав у нас по большому счету уже загружена в массив, то можем ли мы сокраситить сие дейстивие
IN ({$groupids}) AND a.auth_rights & {$mn['R']} = {$mn['R']}
в самом запросе?]]>
Za, 06 Feb 2010 01:07:41 -0000
Trustmaster
AND a.auth_rights & {$mn['R']} = {$mn['R']}
Это и есть наложение битовой маски на число auth_rights. Неплохо бы почитать что-нибудь. Приведу простой пример. Пусть у нас всего 4 разряда используется и auth_rights = 1011. Если $mn['R'] == 1 == 0001, а $mn['A'] == 4 == 0100, то 1011 & 0001 == 0001, а вот 1011 & 0100 == 0000.

А вот права надо брать по объединению групп, а не по главной или пересечению.]]>
Za, 06 Feb 2010 00:54:41 -0000
esclkm AND a.auth_rights & 1 = 1

Добавлено 3 часа 29 Минут спустя:

и насколько я помню - у нас права читаются по основной группе а не по всем. или ошибаюсь?]]>
Vr, 05 Feb 2010 16:24:03 -0000
Trustmaster # esclkm : стоп.. стоп.. начало я впринципе освоил и сам когда копаллся в этой функции...
а теперь пример если можно с sql (вот это для меня загадка - начало то я понял давно)))
например выборку техже новостей
ну нас есть 2 подкатегории av - доступная для всех nv - недоступная.
как сделать запрос чтобы бралось то что надо)

Добавлено 3 Минуты спустя:

ну или комментариии к только доступным страницам. с учетом полученныз знаний?
или проще занарее просчитать возможные значение - где есть чтение?
Допустим, нам известны $groupids пользователя и $c категории, тогда:
SELECT * FROM
	sed_pages AS pg
		LEFT JOIN sed_auth AS a
			ON (a.auth_code = 'page' AND a.auth_option = '{$c}')
	WHERE
		pg.page_cat = '{$c}' AND a.auth_groupid IN ({$groupids}) AND a.auth_rights & {$mn['R']} = {$mn['R']}
	GROUP BY pg.page_id;
Но надо сказать, запрос довольно тяжёлый для базы.]]>
Vr, 05 Feb 2010 16:19:39 -0000
Sergey
Однако в котонти осуществлен только групповой доступ к категории. Для этого надо сформировать по правам доступа некоторый массив допусти $all_cat, в котором будут перечислены все категории где данный юзер может читать страницы (имеет нужное право доступа). Затем, этот массив превратить в строку типа Len_cat=cat1,cat2,...catn. в MySQL есть замечательная функция
FIND_IN_SET(str,strlist) 
Возвращает значение от 1 до N, 
если строка str присутствует в списке strlist, состоящем из N подстрок. 
Список строк представляет собой строку, состоящую из подстрок, разделенных символами `,'. 
Если первый аргумент представляет собой строку констант, 
а второй является столбцом типа SET, функция FIND_IN_SET() 
оптимизируется для использования двоичной арифметики! Возвращает 0, 
если str отсутствует в списке strlist или если strlist является пустой строкой. 
Если один из аргументов равен NULL, возвращается 0. 
Данная функция не будет корректно работать, 
если первый аргумент содержит символ `,':
в strlist загоняем Len_cat, а str наше поле page_cat . Это я так гипотетически. Следует принять во внимание, что возвращает номер cat из Len_cat

Добавлено 17 Минут спустя:

Кстати в функции function sed_auth($area, $option, $mask = 'RWA') есть замечательный фрагмент:
			if(is_array($usr['auth'][$area]))
			{
				foreach($usr['auth'][$area] as $k => $g)
				{
					$cnt += (($g & $mn[$ml]) == $mn[$ml]);
				}
			}
где как раз можно и подобрать эти категории $area.
Как быть со всей толпой, соответственно и для толпы есть категория гость.]]>
Vr, 05 Feb 2010 06:23:31 -0000
esclkm а теперь пример если можно с sql (вот это для меня загадка - начало то я понял давно)))
например выборку техже новостей
ну нас есть 2 подкатегории av - доступная для всех nv - недоступная.
как сделать запрос чтобы бралось то что надо)

Добавлено 3 Минуты спустя:

ну или комментариии к только доступным страницам. с учетом полученныз знаний?
или проще занарее просчитать возможные значение - где есть чтение?]]>
Vr, 05 Feb 2010 05:55:36 -0000
Sergey
function mobil_auth_getvalue($mask)  
{
$mn['0'] = 0;
$mn['R'] = 1;
$mn['W'] = 2;
$mn['L'] = 2;
$mn['1'] = 4;
$mn['2'] = 8;
$mn['3'] = 16;
$mn['4'] = 32;
$mn['5'] = 64;
$mn['A'] = 128;

$masks = str_split($mask);

foreach($mn as $k => $v)
 {
 if (in_array($k, $masks)) { $res += $mn[$k]; }
 }
return($res);
}
Что делает эта функция? Она берет пользовательское обозначение прав и превращает их в компактную форму. Например, $mask =RW, функция str_split превращает входное значение в массив состоящий из двух элементов R и W, другая функция in_array($k, $masks) ищет перебирая массив $mn ассоциативные коды в $masks. В нашем случае это будут коды R и W со значениями $mn['R'] = 1; и $mn['W'] = 2; Найденные значения суммируются. Получится 3. Т.е. число 3 это есть битовое указание на R и W. Обратите внимание, в функции есть и эквивалент $mn['W'] = 2; это $mn['L'] = 2;
Теперь давайте выстроим массив $mn так:

бит 1 $mn['R'] = 1;
бит 2 $mn['W'] = 2;
бит 3 $mn['1'] = 4;
бит 4 $mn['2'] = 8;
бит 5 $mn['3'] = 16;
бит 6 $mn['4'] = 32;
бит 7 $mn['5'] = 64;
бит 8 $mn['A'] = 128;

Для того, чтобы получить значение бита из сгруппированного кода прав (записываемого в поле таблице для строки) необходимо проделать следующую операцию:
$бит = (($код_прав & $маска_бита(ов)) == $маска_бита(ов));

$бит будет иметь, в такой операции два состояния: FALSE или TRUE. Следовательно если маска_бита (например) равна 2, то мы сразу выясним. может ли в данную строку что-либо записано т.е. если W в е правах. Однако можно проверить и сумму прав, достаточно сложить нужные биты. Например RA (имеем право читать и администрировать) этот код будет = 1+128=129.
В MySQL имеется и соответственная функция (6.3.6.1 Битовые функции) функция побитового сложения т.е. &
которая, как раз и предназначена для этих целей: выборке строк соответствующих функции побитового сложения, в нашем случае поиску строк с определенными правами. Эта функция выполняется на самом низком операционном уровне процессора, практически мгновенно. В 3 шага микропроцессора. Придумывать другой механизм, это значит увеличивать количество машинных кодов в сотни (тысячи раз) вместо 3. (я так гипотически, может и 2 шага, все в особенностях куда маска на какой регистр улетела, но это уже не нашего ума дела)]]>
Vr, 05 Feb 2010 05:34:33 -0000
esclkm в тестовом виде я понимаю - но вот как сделать запрос... чтобы проверить есть ли у глуппы права на чтение, а не делать начала - проверку по группам, а потом IN()]]> Vr, 05 Feb 2010 04:10:21 -0000 Trustmaster
Существует две модели политики безопасности:
  1. Избирательная политика безопасности. Как правило, реализуется с помощью матрицы доступа (МД). В такой матрице строки - это объекты, права доступа к которым предоставляются, а столбцы - субъекты, которым предоставляется доступ. На пересечении - права, которые доступны (в примитивном случае - это просто разрешение "да/нет"). Знаменитые ACL (Access Control Lists) - это та же самая МД. В Seditio используется МД, где объект - некая область на сайте, а субъект - это группа пользователей. В ячейках один байт, в котором сжаты все привилегии. Такая модель относительно компактна. Если мы реализуем доступ на уровне каждого пользователя, и на уровне каждого элемента таблиц, и расширяем набор возможных прав, то размер матрицы увеличивается многократно (а именно, в N_пользвателей x N_строк раз). И значительно падает скорость алгоритмов авторизации (предоставления доступа).
  2. Полномочная политика безопасности. Как правило, каждый объект в системе (категория, страница, форум) имеет свою метку критичности (число или токен), которая определяет важность информации. Каждый субъект имеет уровень прозрачности (число или токен), который определяет ширину полномочий. Если коротко, то субъект может получить доступ к объекту, если его уровень прозрачности не ниже метки важности объекта. Другое правило гласит, что субъект может изменять объект, если его текущий уровень безопасности (число от 0 до уровня прозрачности) не выше метки важности объекта. Это позволяет строить строгую иерархию при движении данных.
Реализация комбинированных систем авторизации - не такая уж простая задача алгоритмически, особенно если учесть, что объектов на крупных сайтах сотни тысяч и миллионы. Так что маханием шашкой тут не обойдёшься.

Размышляя над этой проблемой, я однозначно отказался от расширения матрицы доступа (причина выше). Возможно "уточнение" имеющейся матрицы в индивидуальном порядке в качестве исключений (скажем, добавлять новые объекты и субъекты по явному требованию администратора), но тут тоже свои трудности с "массовой" обработкой данных для групп субъектов и объектов. Более интересной выглядит разработка системы, подобой той, что упоминает Sergey, однако меня пугает её сложность и громоздкость.]]>
Vr, 05 Feb 2010 04:03:32 -0000
Sergey # Gunslinger : Sergey, тоесть основная причина отказа с вашей точки зрения от такой наработки исключительно в сложности ее реализации? (просто уточняю правильно ли я понял)
Скорее всего не в сложности, сколь в слепом копировании чужих успехов, но не заложенных ресурсов, а результатов текущего момента.
Добавлено 4 Минуты спустя:

Правильно, что не поняли. Это мой, реальный проект, который я сейчас испытываю с правами на все и вся в системе. Действительно, размер программных модулей уже превышает размер движка.
а вот выражение:

$rights_r = 1; //Read - чтение
$guest_read = (($guest_read & $rights_r) ==$rights_r);


есть стандартная операция получения права, когда код прав чего-либо маскируется маской соответствующего права, в данном случае, права на чтение отдельной страницы.]]>
Thu, 04 Feb 2010 23:58:11 -0000
esclkm
и я не нашел позиции или ее не понял с налета - где идет чтение прав?]]>
Thu, 04 Feb 2010 23:54:16 -0000
Sergey
$guest_read = (isset($cfg['plugin']['userseditpage']['auth_user']))?$cfg['plugin']['userseditpage']['auth_user']:RIGHTS_EMPTY; //переходный переиод
			$guest_read = (($guest_read & $rights_r) ==$rights_r);
			sed_die(empty($sed_cat[$c]['maker']) and !$usr['isadmin']);
			$id_el=$pag['page_id'];
			$link_code=$struc_link['structure_id'].':'.$pag['page_id'];
			$link_code_ex='-'.$struc_link['structure_id'].':'.$pag['page_id'];
			$link_code_want='+'.$struc_link['structure_id'].':'.$pag['page_id'];
			//echo $link_code."=link_code <br/>";
        
			$sql = sed_sql_query("SELECT COUNT(*)  FROM $db_pages
				WHERE (FIND_IN_SET('$c',page_cat)
				OR FIND_IN_SET('$c',page_cat_extending))
				AND (page_state=0 OR page_state=2)
				AND (page_id != $id_el)
				AND (NOT FIND_IN_SET('$link_code',page_cat_extending))
				AND (NOT FIND_IN_SET('$link_code_ex',page_cat_extending))
				AND (NOT FIND_IN_SET('$link_code_want',page_cat_extending))
				AND (page_ownerid = {$usr['id']}
				OR ((page_rights & $rights_r)=$rights_r)
				OR IFNULL(NOT page_rights,('$guest_read')))");
				$totallines = sed_sql_result($sql, 0, 0); //echo "totallines=".$totallines."<br/>";
				$sql = sed_sql_query("SELECT p.*, u.user_name ".$join_ratings_columns."
				FROM $db_pages as p ".$join_ratings_condition."
				LEFT JOIN $db_users AS u ON u.user_id=p.page_ownerid
				WHERE (FIND_IN_SET('$c',page_cat)
				OR FIND_IN_SET('$c',page_cat_extending))
				AND (page_state=0 OR page_state=2)
				AND (page_id != $id_el)
				AND (NOT FIND_IN_SET('$link_code',page_cat_extending))
				AND (NOT FIND_IN_SET('$link_code_ex',page_cat_extending))
				AND (NOT FIND_IN_SET('$link_code_want',page_cat_extending))
				AND (page_ownerid = {$usr['id']}
				OR ((page_rights & $rights_r)=$rights_r)
				OR IFNULL(NOT page_rights,('$guest_read')))
				ORDER BY page_$s $w LIMIT $d,".$cfg['maxrowsperpage']);
]]>
Thu, 04 Feb 2010 23:51:21 -0000
Gunslinger Sergey, тоесть основная причина отказа с вашей точки зрения от такой наработки исключительно в сложности ее реализации? (просто уточняю правильно ли я понял)]]> Thu, 04 Feb 2010 23:39:46 -0000 Sergey http://www.allpravo.ru/library/doc2527p/instrum3503/item3604.html владею и распоряжаюсь + наследую. Учитывая характер операции дублирования, то появляется право дублирования. Т.е. фактически вся шкала прав уже занята. По крайней мере, я уже год, как проектирую такую систему. Конечно, это достигается плагинами, но система уже сделана правильно и позволяет применять всю возможную гумму прав на отдельные компоненты и информацию. Например, вы желаете подключить плагин, который предусматривает право платного его использования на ресурсе, следовательно, если вы оплатите работу этого плагина, то для вас будет выставлено право его распоряжения. Вы, решили продать, какую-то часть ресурса в аренду, вот вам право владения.]]> Thu, 04 Feb 2010 23:25:14 -0000 Gunslinger Thu, 04 Feb 2010 21:07:17 -0000 Sergeich Thu, 04 Feb 2010 19:01:30 -0000 jcrush Thu, 04 Feb 2010 17:44:48 -0000 esclkm таже таблица теже значения - 1 - 255
в практике плагино писательства - если честно это очень неудобно.
обычно это свобится или постоянному sed_auth или запросу с IN
и то и то я не считаю рациональным.
А если надо прочитать права другой группы (пример плагин стена пользователей) тут вообще начинается романтика.
может всетаки лучше эту таблицу упростить до вида
tinyint и граф (R, W, A, D, 1, 2, 3, 4, 5) - 0 недоступно , 1 доступно...

изначальная цель этого явления кратного 8(?) мне непонятна.]]>
Thu, 04 Feb 2010 17:39:29 -0000