Аутентификация. Настройка прав

Discussion in 'PHP' started by dimash, 7 Dec 2009.

  1. dimash

    dimash Elder - Старейшина

    Joined:
    14 Apr 2008
    Messages:
    78
    Likes Received:
    2
    Reputations:
    0
    Каким образом построить систему прав? Свой-чужой, администратор - пользователь - редактор. Как это грамотно сделать, не используя булевую алгебру.
     
  2. whexp

    whexp Member

    Joined:
    30 Nov 2009
    Messages:
    88
    Likes Received:
    29
    Reputations:
    5
    Что значит не используя булеву алгебру? Ее для того и придумали, чтобы использовать. В таблице users создаешь колонку, например, is_admin, которое проверяешь, когда хочешь, чтобы к данной странице имел доступ только админ. Так же можешь создать колонку, например perms. Там пишешь строки формата 000, где первый символ принимает значение 1, если пользователь админ. Второй символ принимает значение 1, если пользователь имеет право создавать новости, и 3 символ, если он имеет право оставлять комментарии. Дальше постоянно проверяешь права при доступам к страницам.

    В итоге, если пользователь имеет право создавать новости и оставлять комментарии, но он не админ, то в колонке будет 011
     
  3. LStr1ke

    LStr1ke Elder - Старейшина

    Joined:
    29 Jul 2009
    Messages:
    801
    Likes Received:
    145
    Reputations:
    73
    Или создай отдельную таблицу с id привелигированых пользователей.
     
  4. POS_troi

    POS_troi Elder - Старейшина

    Joined:
    1 Dec 2006
    Messages:
    1,569
    Likes Received:
    466
    Reputations:
    108
    Возьми и посмотри реализацию в том-же DLE и все будет ясно и понятно. развели тут демагогию =)
     
  5. LStr1ke

    LStr1ke Elder - Старейшина

    Joined:
    29 Jul 2009
    Messages:
    801
    Likes Received:
    145
    Reputations:
    73
    2m0Hze
    Сколько людей столько и мнений... Считать "херней" то, что удобнее этому человеку - быдло замашки. Реализаций много =\
    этим ты высказал свое мнение.
    Лично мне удобней и наглядней работать с отдельной таблицей. и Выполнить лишний запрос к БД меня не смущает.
     
  6. dimash

    dimash Elder - Старейшина

    Joined:
    14 Apr 2008
    Messages:
    78
    Likes Received:
    2
    Reputations:
    0
    Поподробнее можно, пожалуйста.
     
  7. Forcer

    Forcer Elder - Старейшина

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    Ты не прав. Принципиальное отличие мнения m0Hze от вашего с whexp в том, что вы впринципе не знаете и не понимаете как это сделать правильно и от того начинаете изобретать велосипед и советовать откровенный булшит, прикрываясь тем, что это ваше мнение и вам так удобнее. m0Hze, в свою очередь, говорит все почти правильно, но есть пара недостатков. Вот как это нужно делать на самом деле:
    • Идея с группами пользователей абсолютна верна. Но, кроме добавления поля group_id в таблицу пользователей, нужно создать таблицу groups. В которой кроме очевидных полей(id, name, dscription) будет поле permissions, в котором будет хранится максимально возможно уровень доступа для данной группы. Например, user/moder/admin 10/20/30. Когда пользователь логинится, вся информация о нем, включая permissions, хранится в сессии. В каждый файл вставляется group.php(хотя я бы назвал по-другому, permissions.php, например), задача которого определять, имеет ли пользователь право на выполнение данного скрипта. Делает он это следующим образом - в каждом файле зашита константа, определяющая уровень доступа, который необходим к файлу. Эта константа сверяется с уровнем доступа пользователя, который у нас хранится в сессии. Так же осуществляется контроль доступа к методу/функции - для каждого метода/функции определен необходимый уровень доступа - он сверяется с permission'ами пользователя.
     
    1 person likes this.
  8. dimash

    dimash Elder - Старейшина

    Joined:
    14 Apr 2008
    Messages:
    78
    Likes Received:
    2
    Reputations:
    0
    Зачем в таблице groups необходимы поля name и description?
    user/moder/admin 10/20/30 - имеется ввиду, что косметически можно писать как угодно, например можно писать 1,2,3? Или что-то другое.

    Очевидно, определять константу не обязательно. Достаточно просто сравнить переменную сессии с каким-то значением, правильно? Вы имели ввиду это под словом константа?
    А как проходить реализация контроля доступа к функции? Сама последовательность действий.
     
    #8 dimash, 3 Jan 2010
    Last edited: 3 Jan 2010
  9. Forcer

    Forcer Elder - Старейшина

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    name - название группы. Да, можно ограничиться 2мя полями id и permission, но так таблица будет не очень понятна. Человеческие названия групп дают лучшее понимание сути данных в таблице, позволяют писать более простые и человеческие запросы к бд, а значит меньше вероятность допустить ошибку. И вообще, можно мапить пользователя не к id группы, а к названию. Description - описание, можно не добавлять.

    Да, можно, но лучше оставлять некоторый диапазон между соседними значениями. Это пригодится в будущем, если мы вдруг захотим добавить особую группу, например, между модером и админом - нам придется делать гораздо меньше изменений, чем если бы значения шли друг за другом(1,2,3).


    Какое-то значение - это и есть константа. Информация об уровне доступа, который необходим для метода хранится в самом методе в виде константы.

    Вообще, было бы хорошо, если бы контроль доступа определял некоторый фрэймворк и не приходилось затрагивать код методов. Но я не знаю, есть ли на php такое. В простейшем случае в начале метода нужно вызывать функцию/метод checkPermission, в который передается константа-число, определяющая минимально возможный уровень доступа к данному методу. Этот метод checkPermission общий для всего приложения. Он берет из сессии права пользователя и сверяет с переданным ему в качестве параметра значения. Если переданное ему значение больше/меньше(абсолютно безралично как будут права распределяться user/moder/admin - 10/20/30 или 30/20/10) значения из сесии - то бросается исключение(доступ запрещен) в противном случае метод checkPermission завершает работу и работу продолжает метод, для которого и осуществлялся контроль доступа.
     
  10. -=Zhenek=-

    -=Zhenek=- Elder - Старейшина

    Joined:
    31 Dec 2007
    Messages:
    271
    Likes Received:
    77
    Reputations:
    1
    Мне кажется вот тут нет разницы какой будет цифра. т.к например добавив в админке группу пусть ее ИД будеть хоть 1000 ей можно выставить такие права что она будет между админом и модером (типа младший админи или старший модер)

    Это не важно , если создавать группы динамически.


    пример phpbb3 как самый яркий зайдите в админку,поиграйте с возможностями груп и гляньте в код как там реализованно.
     
  11. dimash

    dimash Elder - Старейшина

    Joined:
    14 Apr 2008
    Messages:
    78
    Likes Received:
    2
    Reputations:
    0
    Вы приведите пример. Если смотреть чужой код и в нем разбираться, то смысл программирования отсутствует. Пока ты что-то додумаешь как кто-то назвал - быстрее сделаешь заново.

    Я вижу группы:
    PHP:
    CREATE TABLE `dnt_webdeveloper`.`gruppy` (
    `
    idSMALLINT64 NOT NULL ,
    `
    pravaENUM'admin''korrespondent''polzovatel' NOT NULL ,
    `
    opisanieVARCHAR1024 NULL ,
    PRIMARY KEY ( `id` ) 
    ENGINE InnoDB
    Есть какие-то замечания?
     
  12. Forcer

    Forcer Elder - Старейшина

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    Неправильный подход. Смотреть чужой код полезно, это один из способов поднять свой уровень. Но, естесственно, нужно быть избирательным.

    Названия на транслите просто ужасны. Для программиста не знать английский просто позор.
     
    #12 Forcer, 6 Jan 2010
    Last edited: 6 Jan 2010
  13. dimash

    dimash Elder - Старейшина

    Joined:
    14 Apr 2008
    Messages:
    78
    Likes Received:
    2
    Reputations:
    0
    Вы загнали, писец. Названия как раз на транслите, и названия сегодня перевел специально. английский на 5 твердую.
     
  14. Forcer

    Forcer Elder - Старейшина

    Joined:
    12 Apr 2007
    Messages:
    321
    Likes Received:
    98
    Reputations:
    12
    Что выкладываешь, то и оцениваю. gruppy, polzovatel - это на 5 твердую? Это просто ужас. Не собираюсь спорить. Считаю, что тема себя исчерпала.
     
  15. -=Zhenek=-

    -=Zhenek=- Elder - Старейшина

    Joined:
    31 Dec 2007
    Messages:
    271
    Likes Received:
    77
    Reputations:
    1
    и тут же пишешь :

    Вот ты возьми и напиши. Следую тому что я описал. Буду вопросы в ПМ или асю (спроси в ПМ на аве старая)

    А смотреть чужой код полезно т.к узнаешь много нового, чем будешь ныть напишите мне пожалуйста, от этого опытнее не станешь.


    100500