These are chat archives for PHPixie/Hotline

7th
Nov 2015
Oleg Scherbakov
@olegatro
Nov 07 2015 00:45
@dracony Сразу оговорюсь, несмотря на несколько лет поддержки сайтов, в плане архитектуры приложений далеко не уехал. Просто меня всегда интересовала тема распределения прав пользователей, т.к. считаю это важной частью приложения. Вот и стало любопытно, реализовано ли в движке что нибудь подобное, и как это сделано, т.е. это скорее в образовательных целях. Самая интригующая статья на эту тему аж 2006 года,
http://www.xaprb.com/blog/2006/08/16/how-to-build-role-based-access-control-in-sql/
http://www.xaprb.com/blog/2006/08/18/role-based-access-control-in-sql-part-2/
но там больше заложены принципы, нежели конкретная реализация и больше в уклон sql, зато видна маштабируемость.
Просто как правило вижу права в плане - редактировать, читать, удалить, а хотелось бы чего то большего.
Kostya
@KokaUA
Nov 07 2015 01:54
Уже не первый человек кто на щет acl спрашивает, пожалуй следующим этим и займусь.
Roman Tsiupa
@dracony
Nov 07 2015 02:36
@Olegatro вот такой acl на уровне стрко в базе есть в симфони
но в реале он хорош только первое время
так как привязывание по айдишкам во первых медленно
во вторых совсем не гибко
например захотел ты запретить какому-то типу пользователей редактировать топикки в отдельной категории
придеться теперь идти в базу и менять все эти связи
а если там сложнее логика
типа редактировать некоторые странцы могут только пользователь с определенной ролью в определенной групе и только по выходным
Roman Tsiupa
@dracony
Nov 07 2015 02:41
такие системи часто гораздо просче написать чем настроить под себя. Единственное что более менее постоянно - наличие ролей
но их и имплементировать не надо))
просто сохранить имя роли в поле и затем проверять
if($user->role() !== 'admin') {
    throw new \Exception("Not allowed");
}
и все)
Kostya
@KokaUA
Nov 07 2015 03:05
@dracony Ну не знаю, я тут на вскидку придумал план. Но пака только обдумываю. Ну роли привилегии это понятно. Но я подумываю еще добавить модель для расширения привилегий. К примеру по мимо стандартных привилегий привязанных к роли, еще добавить возможность делать свои привилегии в самой модели. Ну там редактировать свой пост в течении 15 мин. Грубо говоря стандартная схема роль/превилегия + кастомные превилегии на основе логики в модели.
Хотя щас больше обдумываю как это добро тестировать, точнее как лучше обойти работу с бд. Скорее всего сделаю отдельные методы для получения репозитория что-бы проще мокнуть было.
Oleg Scherbakov
@olegatro
Nov 07 2015 03:30
@dracony Возможно, мне не хватает знаний что бы вести на эту тему конструктивный диалог. ))
На мой взгляд хранений прав у сущностей вместе с ними на уровне бд (unix like), более разумно, нежели хранить права где то отдельно, но это скорее моё представление, возможно и ошибочное.
В любом случаи будет интересно посмотреть реализацию у этого движка, так что подожду))
Roman Tsiupa
@dracony
Nov 07 2015 03:33
Я не говорю хранить отдельно
просто вместо материализировать их свзями
можно просто сдлать все это кодом и условиями
например вот то что @KokaUA упомянул о "разрешыть редактирование в течении 15 минут" гораздо легче проверить кодом во время сохранения
( прошло 15 минут со время создания или нет)
чем создавать в базе связь на 15 минут
а затем ее удалять
даже с точки зрения быстродействия создание, удаление и проверка таких связей в бд намного дороже чем
if(time() - $post->createdAt > 15*60) {
    throw new \Exception("editing not allowed");
}
Oleg Scherbakov
@olegatro
Nov 07 2015 09:59
@dracony М, да, возможно) В любом случаи, спасибо за ответы)
Ivan
@Punk-UnDeaD
Nov 07 2015 11:07
В друпале у пользователя может быть несколько ролей, с одной ролью надо проставлять все доступы ко всем элементам
Roman Tsiupa
@dracony
Nov 07 2015 11:12
ну да, можно также делаеть вложенные роли ( типа если роль админ то значит у него сразу есть роль "редактор" и тд)
а еще есть подход где создаються отдельно права ( типа писать, читать и тд)
кадой роли присваиваеться набор прав
и тогда проверка уже идет на конкрентные права
а не на имя роли
Oleg Scherbakov
@olegatro
Nov 07 2015 11:15
А многоли осталось, для создания проекта на базе движка? кроме rbac`а
Roman Tsiupa
@dracony
Nov 07 2015 11:16
ну систему вот с ролями я могу прям сюда написать))
Oleg Scherbakov
@olegatro
Nov 07 2015 11:17
Т.е. впринципе уже сейчас можно, например, делать веб сайт?
Roman Tsiupa
@dracony
Nov 07 2015 11:17
ну да)
смотри
тебе сколько ролей надо ? тоесть в юзера одна роль иди несколько?
ну возьмем случай где ролей много
Oleg Scherbakov
@olegatro
Nov 07 2015 11:19
Ну, давай, пока рассмотрим простой вариант, без гибкости.
У меня есть литл мечта, сделать веб форум, с гибкими правами, но до этого далеко.
Пусть пока будет просто админ и юзер.
Roman Tsiupa
@dracony
Nov 07 2015 11:19
а пфф так тут супер просто))
Ivan
@Punk-UnDeaD
Nov 07 2015 11:19
Админ как Рут, имеет все права для простоты
Roman Tsiupa
@dracony
Nov 07 2015 11:27

в табличку пользователя добавляешь поле 'role', туда записываешь имя роли admin или user. В ОРМ враппер бзера для красоты добавляем метод:

namespace Project\App\ORMWrappers\User;

// Entity wrapper
class Entity extends \PHPixie\AuthORM\Repositories\Type\Login\User
{
    public function roles()
    {
         // для гибкости возвращаем массив ролей, тогда в будущем будет легче переделать на случай когда ролей много
         return array($this->role); 
    }

    public function hasRole($role)
    {
           return in_array($role, $this->roles(), true);
     }
}

Теперь можем в процессоре проверять :

if(!$user->hasRole('admin')) {
     //ексепшн, редирект итд
}
// обработка запроса

Например можно сделать фильтрацию по УРЛу, типа пускать пользрвателя куда то только если админ:

тут как раз пригодится то как обрабатіваються запросы
Oleg Scherbakov
@olegatro
Nov 07 2015 11:29
Да, выглядит действительно просто))
С марийкой не будет проблем? не тестили? Ну, я думаю не должно
я просто давно перестал мускул ставить
Roman Tsiupa
@dracony
Nov 07 2015 11:34
namespace Project\App;

class HTTPProcessor extends \PHPixie\DefaultBundle\Processor\HTTP\Builder
{
     protected $processorRoles = array(
          'greet' => 'user',
          'secret' => 'admin'
     );

     public function process($request)
     {
           $processorName = $request->attributes()->get('processor');
           $role = $this->processorRoles[$peocessorName];

           $auth = $this->builder->components()->auth();
           $user = $auth->domain()->user();

           if(!$user->hasRole($role)) {
                $http = $this->builder->components()->http();
                return $http->responses()->redirect('/');
           }

           return parent::process($request);
     }
}
типа проверяем роль перед обработкой запроса
так как HTTPProcessor это точка вххода в бандл
Oleg Scherbakov
@olegatro
Nov 07 2015 11:35
ага
Roman Tsiupa
@dracony
Nov 07 2015 11:39
а фктически тут все что хочешь сделать можно))) вплоть до проверки фазы луны=)
Oleg Scherbakov
@olegatro
Nov 07 2015 11:56
И вопрос по orm, когда я добавляю новую запись, как мне получить id сохраненной записи?
И можно ли заменить id auto increment на id uuid_short
Roman Tsiupa
@dracony
Nov 07 2015 11:59
$user->save();
$id = $user->id()
Oleg Scherbakov
@olegatro
Nov 07 2015 12:00
угу, так и думал
Roman Tsiupa
@dracony
Nov 07 2015 12:00
она сразу доступна будет
Oleg Scherbakov
@olegatro
Nov 07 2015 12:00
а что насчет uuid_short ?
Roman Tsiupa
@dracony
Nov 07 2015 12:00
можно
Oleg Scherbakov
@olegatro
Nov 07 2015 12:00
отлично
Roman Tsiupa
@dracony
Nov 07 2015 12:00
главное чтобы бд знала про него
тоесть запрос до last_insert_id
его увидел
Oleg Scherbakov
@olegatro
Nov 07 2015 12:01
хм, мне казалось last_insert_id возращает только id с auto_increment
Roman Tsiupa
@dracony
Nov 07 2015 12:02
ну если так то печаль )
Oleg Scherbakov
@olegatro
Nov 07 2015 12:02
всё именно так)
Roman Tsiupa
@dracony
Nov 07 2015 12:02
если оно не возвращает то и узнать логически не получиться)
но
Roman Tsiupa
@dracony
Nov 07 2015 12:03
можно самому геренить какю-то айдишку в пхп
и присваивать ее
перед созранением
например uniqid() пхпшная
можно конечно сделать select uuid_short()
Oleg Scherbakov
@olegatro
Nov 07 2015 12:07
А вам не присылают ссылки на созданные проекты на основе движка? мне интересно посмотреть на скорость загрузки
Roman Tsiupa
@dracony
Nov 07 2015 12:08
где-то было пару
но их никуда не записывал, так что не вспомню)
может кто-то отпишеться потом
ссылка на бенчмарк на сайте есть)
на минимальный проект можно ппосмотреть скачав
Oleg Scherbakov
@olegatro
Nov 07 2015 12:13
Интересный бечмарк, почти фалкон догнали, несмотря на то что это c расширение
В любом случаи движок не поможет, если говнокодить.
Спасибо за ответы, обязательно попробую что нибудь сделать на базе движка
Roman Tsiupa
@dracony
Nov 07 2015 12:29
кстати там пхп7 уже почти вишел
можно уже сразу на нем писать)
Oleg Scherbakov
@olegatro
Nov 07 2015 12:29
я старый то php плохо знаю))) сразу новый синтаксис учить?))
Вообще этот год богат на релизы, новый симфони, новый зенд. Бустрап не знаю когда релизнут
Roman Tsiupa
@dracony
Nov 07 2015 12:36
там нет нового синтаксиса
просто работает в 2 раза быстрее
=)
ну синтаксис тоже есть но он не пригодится)
типа анонимные классы итд
Oleg Scherbakov
@olegatro
Nov 07 2015 12:38
м, хорошо)
Kostya
@KokaUA
Nov 07 2015 13:43
Было бы весело стрикт моде по-умлочанию включить)
Roman Tsiupa
@dracony
Nov 07 2015 14:28
В самом фреймворке
Так а разве он не включен?
Kostya
@KokaUA
Nov 07 2015 14:34
@dracony Я про обязательное указание типов. По-умолчанию можно задавать, а можно те. Если не чего не путаю то declare(strict_types=1) требует обязательно. Если есть контейнер с php7 проверь.
Roman Tsiupa
@dracony
Nov 07 2015 14:38
Аааа
Так оно только на текущий файл распространяетьс
Kostya
@KokaUA
Nov 07 2015 14:38
Ну я и говорю вот бы включили глобально для всех, без декларации)
на сколько бы чище стал мир php)
Roman Tsiupa
@dracony
Nov 07 2015 15:25
Хм ну проблема пхп явно не в типизации )))
Kostya
@KokaUA
Nov 07 2015 19:06
@dracony Ну да скорее в шаловливых ручках некоторых разработчиков.
Roman Tsiupa
@dracony
Nov 07 2015 19:07
))
Я вот вчера фиксил сайті свои чтобі на 7ке запускались
Так вот phpixie 1 ( не 2 ) без проблес пошла
Кохана старая поматерилась что mysql модуля в 7ке нет, преключил на mysqli (путем реплейса mysql на mysqli)
Тоже поехала
Вордпрес как родной встал
А вот джумла провалилась в пропасть
И проблема не в типизации даже
Они там просто писец накодили
Типа стандартние методі статически визивают
Итд
Так что все от рук зависит )
Kostya
@KokaUA
Nov 07 2015 19:40
И настал момент искать замену joomla + virtuemart
Roman Tsiupa
@dracony
Nov 07 2015 22:35
)))
Ну правда она версии 1.5 у меня )))