Да, но
Gluchik 21.09.2005 18:53
/ 21.09.2005 18:55
Я не оспариваю то, что она правильная и удобная. Но мне кажется, что для некоторых, специфических случаев ее можно сделать более универсальной. В большинстве случаев это не понадобится, но в некоторых случаях вполне, как мне кажется, может. На это тему и хотел спросить мнение профессионалов.
Пример. Есть родительский объект, и у него сотни детей. По умолчанию, даю всем права read (1) на папу и irf'ом пропускаю слив этих прав на всех детей. В таблице acl минимум одна запись - Объект - группа. Может быть и больше, но не так много как могло было бы быть, раздавая права на каждого ребенка.
Теперь надо одному или нескольким юзерам запретить read (1) одного из детей. Я вижу тут два варианта. 1. На объект убирать первый (read) бит из irf. И назначать на него права отдельно каждому пользователю кроме несчастного. Но.. их надо сначала вычислить для папы.. 2. снять права с папы и по отдельности прописать их для всех детей и всех пользователей кроме несчастного. Это породит много записей.
То же в обратную сторону.
Есть еще один вариант, выкинуть пользователя из группы, но это тоже не будет проще, ибо к остальным объектам доступ он должен сохранить.
А вот так мне видится более элегантное решение - запрещаем чтение ребенка. одна запись в таблицу deny. Больше ничего. Потом обычным способом считаем права для пользователя на объект, учитываем все наследия, группы, овнеров и т.д. Все это есть в Мишином классе. Затем точно так же считаем запретные права для него же. Результат получаем как $access_rights & ~$deny_rights.
Пересчитывать права для других пользователей и объектов не надо.
Еще в плюс, можно простым запросом вытягивать списки запретов в разных вариациях и откатить запрет можно одним делитом. К тому же запретных прав будет однозначно меньше чем обычных, и если закешировать запросы, на быстродействии это не должно сильно сказаться.
Или я все усложняю и есть решение еще проще?