Задать вопрос
Контакты

Достижения

Все достижения (15)

Наибольший вклад в теги

Все теги (42)

Лучшие ответы пользователя

Все ответы (34)
  • Отображение непечатных символов в SublimeText2 как это делается в vim'e?

    @unity_ultra_hardcore
    Переводы строк, кажется, не получится показать, а вот табы и пробелы — легко: достаточно в User Settings добавить
    «draw_white_space»: «all»
    Ответ написан
    1 комментарий
  • Как правильно хранить в базе данные о авторизации юзера через социальную сеть?

    @unity_ultra_hardcore
    У нас используется следующая схема таблиц:
    Table "public.social_account"
       Column    |              Type              | Modifiers
    -------------+--------------------------------+-----------
     user_id     | integer                        | not null
     network     | character varying(255)         | not null
     external_id | character varying(255)         | not null
     created_at  | timestamp(0) without time zone | not null
     updated_at  | timestamp(0) without time zone | not null
     id          | uuid                           | not null
    Indexes:
        "social_account_pkey" PRIMARY KEY, btree (id)
        "unique_social_account" UNIQUE, btree (network, external_id)
        "idx_f24d8339a76ed395" btree (user_id)
    Foreign-key constraints:
        "fk_f24d8339a76ed395" FOREIGN KEY (user_id) REFERENCES app_user(id) ON DELETE CASCADE


    То есть для каждой привязки хранится запись, в которой содержится user_id, название соцсети (google/vk/facebook/etc) и id этой соцсети (у всех произвольный формат).
    Таким образом, когда пользователь аутентифицируется через одну из этих соцсетей, сначала ищется user_id по связке external_id + network. Если user_id найден - аутентифицируем текущего пользователя как этот user_id. Если нет, получаем от соцсети email и по нему ищем пользователя в таблице пользователей. Если нашли, то создаем запись в social_account и аутентифицируем юзера. Если не нашлось ничего (первый визит), то создаем пользователя и создаем запись в social_account.
    Ответ написан
  • Как защитить api от перехвата?

    @unity_ultra_hardcore
    Чтобы защититься от снифферов достаточно перейти на HTTPS.
    Чтобы ограничить неофициальные клиенты запрос можно подписать. Обычно каким-то образом однозначно сериализуют запрос, хешируют его на клиенте заранее известной солью и передают этот хеш в запросе. Серверу эта соль также известна и он повторяет эти действия, после чего сравнивает полученный с отправленным клиентом.
    Но это всё ерунда: при наличии желания и физического доступа к джейлбрейкнотому айфону алгоритм формирования подписи можно выковырять из приложения за разумное время.
    Ответ написан
    5 комментариев
  • Как лучше хранить картинки?

    @unity_ultra_hardcore
    Лучше папку именовать не как id, а как какая-нибудь простая хеш-функция от этого id. Причем, не класть всё на один уровень, а распределить их на 2-3. Ниже пример для статьи с id=123
    md5(123) = 202cb962ac59075b964b07152d234b70
    берем первый символ хеша - 2, создаем папку "2" в /uploads/images
    берем второй символ хеша - 0, создаем папку "0" в /uploads/images/2
    создаем папку "202cb962ac59075b964b07152d234b70" в /uploads/images/2/0/
    кладём в /uploads/images/2/0/202cb962ac59075b964b07152d234b70 нужные файлы

    Плюсом такого рещения будет то, что из-за хеш-функции папок будет фиксированное количество и файлы по ним будут относительно равномерно размазаны. Если файлов будет очень много, можно добавить ещё один уровень. Путь этот вычислить программно будет не сложно, если метод его вычисления будет находиться в одном месте.
    Ответ написан
    7 комментариев
  • Как создать проект на Symfony2 с конфигами на PHP, а не на YAML?

    @unity_ultra_hardcore
    В бандле у вас есть файл DependencyInjection/AcmeAppExtension.php.
    Если его содержимое привести примерно к такому виду, то должно получиться (правда сам я не пробовал этим заниматься).
    <?php
    
    namespace Acme\AppBundle\DependencyInjection;
    
    use Symfony\Component\DependencyInjection\ContainerBuilder;
    use Symfony\Component\Config\FileLocator;
    use Symfony\Component\HttpKernel\DependencyInjection\Extension;
    use Symfony\Component\DependencyInjection\Loader;
    
    /**
     * This is the class that loads and manages your bundle configuration.
     *
     * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
     * @codeCoverageIgnore
     */
    
    class AcmeAppExtension extends Extension
    {
        /**
         * {@inheritdoc}
         */
        public function load(array $configs, ContainerBuilder $container)
        {
            $configuration = new Configuration();
            $this->processConfiguration($configuration, $configs);
    
            $loader = new Loader\PhpFileLoader($container, new FileLocator(__DIR__ . '/../config/'));
            $loader->load('services.php');
    
            if ($container->getParameter('kernel.environment') == 'dev') {
                $loader->load('services_dev.php');
            }
    
            if ($container->getParameter('kernel.environment') == 'test') {
                $loader->load('services_test.php');
            }
        }
    }

    P.S. я лично тоже считаю, что это большая глупость - отказываться от yml в пользу php-конфигов: это нарушает основной принцип конфигурации - ее детерминированность. В php-конфиге можно наворотить какой-то логики при вычислении того или иного параметра, что отрицательно скажется на удобстве поддержки проекта.
    Ответ написан
    Комментировать

Лучшие вопросы пользователя

Все вопросы (18)