За последние 24 часа нас посетили 17613 программистов и 1722 робота. Сейчас ищут 932 программиста ...

Распределение прав

Тема в разделе "Прочие вопросы по PHP", создана пользователем Mr.M.I.T., 9 дек 2008.

  1. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Нужно сделать систему распеределения прав для плагинов, прагины хранятся как Plugins/{PluginName}/{PluginName}.class.php
    по сути это даже не класс а системная автономная единица, т.е. плагин запускается при создании класса
    Теперь мне нужен класс с правами для этого плагина, т.е. если это плагин комментариев, то методы в классе например CanEditComments CanDeletComments и др, возвращают true/false

    Вообщем это всё вступление, проблем тут нет, проблема в динамической подгрузке этих классов
    одним autoload тут уже не обойтись...
    написал пока такой нехороший код
    PHP:
    1.  
    2. <?
    3. class Righter {
    4.   public static $RightSave;
    5.   static function plugin($name) {
    6.       if (!support::check_plugin($name))
    7.           trugger_error("Ошибка плагин $name не найден",E_USER_ERROR);
    8.       if(!self::$RightSave[$name]) {
    9.          include_once "sis/Plugins/$name/rights.class.php";
    10.          $classname="rights".$name; // пцц
    11.          self::$RightSave[$name]=new $classname;
    12.       }
    13.       return self::$RightSave[$name];
    14.   }
    15. }
    16. ?>
    17.  
    вообщем не нравицо мне,
    как мне динамический подгружать классы с правами?
     
  2. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    А как в системе определяются действия? У меня, например, так:
    Есть ссылка admin.php?m=news&a=new
    Это значит, что модуль - новости, действие - вывод формы для написания новости. Проверка формы и запись в базу определяется действием &a=new_act
    Так для каждого модуля у меня определён набор действий (экшенов). Они группируются в отдельном файле вида:
    $экшенс[написать новость] = массив(форма, запись в базу);

    Есть таблица в бд где для каждого юзверя прописаны экшены из всех модулей и флаг можно/нельзя и есть функция для проверки прав доступа в модуль. :) Вот как-то так.
     
  3. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    а у меня только одна переменная act которая отвечается за текущий модуль, остальное всё разбивается на массив, короче что-то вроде
    category/cat_name1/
    где category текущий модуль тобишь значение переменной act, а название категории получает сам модуль категории примерно так
    $z=explode("/",$_SERVER['REQUEST_URI']);
    $catname=array_pop($z);
    у меня немного нето, у меня нет чёткого разделения на модуль и плагин, так вот модуль это всегда отдельная страничка сайта типа ?act=search а плагин это всего лишь класс, он может быть отдельной еденицей как комментарии и тогда он будет вызываться автоматически модулем если надо(там каждому плагину приписанна зона), а результат работы плагина будет включён в шаблон в виде переменной,
    но плагин может быть простым вспомогательным классом(запросы в бд там всякие лежат и др) используемым модулем(в таком случае его может и вообще не быть)

    короче почему нельзя-то, например
    редактировать комментарии может глобальный администратор, админ комментариев, и пользователь если это его комментарий и ему разрешено его редактировать
    т.е. получается такое условие
    if ($_SESSION['user']['rights']['global_admin'] ||
    $_SESSION['user']['rights']['comment_admin'] ||
    $_SESSION['user']['rights']['caneditowncomments'] && $_SESSION['user']['id']==$id_comment){
    тогда можно редактировать
    }
    как это записать в бд..можно конечно, но придётся евалить

    Upd
    Вчитался щас в твоё сообщение, так у тебя что для каждого Юзверя прописанны свои права? а не для ЮзверьГрупп как у меня??

    Зы. Хотя по сути я пытаюсь сделать тоже самое только на классах а не в переменной как это у тебя...т.е. у тебя $rights['news']['canAddNews'] у меня должно быть Righter::plugin('news')->canAddNews()
     
  4. Hight

    Hight Старожил
    Команда форума Модератор

    С нами с:
    5 мар 2006
    Сообщения:
    7.153
    Симпатии:
    0
    Адрес:
    из злой параллельной вселенной
    У меня можно и для групп и для юзверей. У меня такая иерархия:
    1. Есть юзвери и группы, у них есть статусы - гость, юзверь, админ, рут.
    2. Начиная с админа можно ходить в админку, но делать там чего-то нельзя, если юзверю, или одной из групп в которую он входит, не прописано, что можно что-то в админке делать. Во! Иными словами я могу сделать так, что ты сможешь ходить в админку и, например, только писать новости, но не редактировать!

    p.s. руты могут всё.
     
  5. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    У меня в админке такие же права как и в плагинах,
    у меня вообще админка это те же плагины только в другой папке...
    а можно в админку или нет за это отвечает параметр canEnterInAdminCenter группы пользователей
    Зы. Global_Admin может всё =)
    Зыы. А кстати, мне мой метод уже начинает нравится, хотя мб это потому что спать хочецо...
     
  6. Вльдемар

    Вльдемар Активный пользователь

    С нами с:
    20 май 2006
    Сообщения:
    635
    Симпатии:
    0
    Адрес:
    Белхород
    Делал распределение прав, вышло 4 таблицы(группы, пользователи, список прав, право+юзер_или_группа) + хитрая функция выборки прав с использованием UNION

    В итоге права можно назначать как группе так и пользователю, при чем назначив право для группы, можно запретить это право для определенного пользователя который находится в этой группе.
    Тестировал не долго, но мне кажется производительность хромает.
     
  7. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    но у меня-то немного другая проблема
    у меня права хранятся в юзергруппе в виде сериализованного массива
    а проблема в хранении вот таких условий
    и чтобы они были достурны в любой части системы...
     
  8. Вльдемар

    Вльдемар Активный пользователь

    С нами с:
    20 май 2006
    Сообщения:
    635
    Симпатии:
    0
    Адрес:
    Белхород
    при загрузки страницы права считываются для текущего пользователя
    ну и по коду встречаются конструкции примерно такого вида
    PHP:
    1.  
    2. <?php
    3. $perm = new Permissions();
    4. if ($perm->isPermission('MODER_NEWS')==true)
    5. {
    6. // разрешено
    7. }
    8. else
    9. {
    10. die('Недостаточно прав');
    11. }
    12.  
    13. // примерно как выглядит класс
    14. class Permissions{
    15. private $permission = array();
    16. function __construct()
    17. {
    18. $this->permission = 'SELECT * from table'; // тут утрировано
    19. }
    20. function isPermission($perm) //можно и с массивом прав сделать чтоб писать isPermissions(array('PERM_ONE', 'PERM_TWO'))
    21. {
    22. return in_array($perm, $this->permission);
    23. }
    24. }
    25. ?>
    26.  
     
  9. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    ну это одно дело, у меня,
    я же не буду кажный раз писать
    Код (Text):
    1. if ($perm->isPermission('MODER_NEWS') || $perm->isPermission('GLOBAL_ADMIN') || $perm->isPermission('CONTENT_ADMIN') || $perm->isPermission('CanEditOwnPost') && $_SESSION['user']['id']==$postId)
     
  10. GreatWasp

    GreatWasp Активный пользователь

    С нами с:
    11 янв 2008
    Сообщения:
    94
    Симпатии:
    0
    Адрес:
    Узбекистан, Ташкент.
    Предлагаю присмотреться к ZF. Как там реализован брокер плагинов.
    А так же распределение прав - система такая:
    1. К контроллеру привязан плагин в котором есть метод ПРЕД-ОБРАБОТКИ.
    2. По URI определяется действие и по нему же права. Если доступа нет, то юзер идет на страницу ошибки.

    Очень удобно.
    @see MVC
     
  11. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    У меня свой фреймвок.
    Осовная идея побольше процедурника, поменьше классов, пока реализовать не удалось =))
    зато удалось реализовать полностью наборную систему, т.е. есть основной фреймвок(небольшой) - всё остальное плагины и модули.
    вот уж чего чего, но с MVC я врятли когда-нибудь ещё буду работать на php...
     
  12. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    как интегририруется модуль в ядро?
     
  13. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    модуль?
    название модуля передаётся по ссылке ?act={Modul.Name} есть пара состояний, когда модуль инклудится автоматом, типа модуля по дефолту

    плагины разбиты по зонам,
    зоны могут быть где угодо, но в основном это модули и глобальная зона - зона __global =)
     
  14. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    =)

    дада. модуль. расскажди кому нить еще. модуль... ГЫ!

    а там switch($mode) {} да? =)

    слаще include($strModulName); ниче не знаем?

    =)

    тебе б теории почитать нормальной, осознать ее. ОППРОБОВАТЬ, тогда 100% уверен, что с твоим потенциалом был бы неплохой толк, а так... отсебятина... причем мелкого пошиюа. но оно и понятно... без обид.
     
  15. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    ну расскажи чё там слаще includa есть? правдо не знаю...
    OOPS не вдохновил на подвиги :p
     
  16. GreatWasp

    GreatWasp Активный пользователь

    С нами с:
    11 янв 2008
    Сообщения:
    94
    Симпатии:
    0
    Адрес:
    Узбекистан, Ташкент.
    Mr.M.I.T.
    Ну и зря.... полностью согласен с 440Hz.

    Почему я в основном всегда ЗА фреймворки (не самописные для себя, а прижившиеся к народу), т.к. эти фреймворки тестит куча людей, и пишут их люди думаю пограмотнее чем Вы накропаете сами.
     
  17. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    GreatWasp
    а зачем вообще тогда писать движки?
    есть же уже готовые...
    нет не зря,
    с чистым MVC мне не удалось добится нормальной, гибкой плагиномодульной системы,
    хотя может я что-то не так делал,
    может ты мне объяснишь на словах структура двига, с автономными, автоинтегируемыми, модулями и плагинами, в чистом MVC естественно (что модель(и), где контреллер(ы), вид)...
     
  18. эээ... че то вы зеленое с высоким сравниваете. Какая связь между ООП, МВЦ, и модульностью ???
    Каждое из них отдельное, независимое понятие.
     
  19. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    флоппик
    а кто сравнивает?
    я просто говорю, что не смог в рамках мвц НОРМАЛЬНО сделать гибкую модульную систему
     
  20. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    объединяют их всего две вещи:

    1. мозг
    2. пиво
     
  21. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    <offtop>
    на баш......
    </offtop>
     
  22. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    знакомые сказали что влияет на потенцию =\\