PHP + PAM

PHPАутентификация через системных пользователей линукс

Предположим, что возникла потребность аутентифицировать пользователей PHP-приложения посредством уже существующих в системе пользователей. Тогда для решения этой задачи можно заюзать PAM (Pluggable Authentication Modules). Если в двух словах, то через эту систему производятся манипуляции с пользователями и их паролями такими программами, как login, passwd или su. Если нужно больше информации, тогда вам сюда, например.

Описываемые ниже действия происходят в Ubuntu 14.04. В той же убунте 12.04 имелся готовый пакет php5-pam-auth, но позже его не стало.

Ставить расширение будем из PECL, вот оно. Предварительно доустановим пару пакетов, если они ещё не установлены. Приступим:

1
2
sudo apt-get install php5-dev libpam0g-dev
sudo pecl install PAM

Без php5-dev будет ругаться, что нету phpize, а без libpam0g-dev будет появляться гадостная ошибка install the the PAM library or use --with-pam=DIR to specify the location.

После успешной компиляции добавляем пару строк в php.ini

1
2
extension=pam.so
pam.servicename="php"

И добавляем соответствующий сервис для PAM

1
2
3
4
sudo su

cd /etc/pam.d
ln -s login php

Готово :)

P.S. Возможен ещё такой момент. При работе, например, через Apache или другой веб-сервер, функция pam_auth будет возвращать ложный результат независимо от правильности логина/пароля. Связано это с тем, что пользователь, от которого работает веб-сервер, не имеет доступ к файлу /etc/shadow. Возможно, что можно каким-то образом донастроить сервис php для PAM, с этим я разбираться не стал, а применил более простое решение - добавил пользователя апача в группу shadow, хоть и понимаю, что почти наверняка этим действием проделал ещё одну дыру в безопасности :)

1
sudo usermod -aG shadow www-data

MySQLПакетное обновление или batch update

Иногда возникает потребность обновить много записей в базе данных, например 3000, 7000 или 25000 штук. Видел даже веб-формы с таким количеством полей, хоть это и полное безумие :) Можно, конечно, обновить эти записи поштучно, но бомбардировать сервер базы данных запросами - плохая идея. Желательно сделать это за раз. И сделать это возможно следующим образом:

1
2
3
INSERT INTO table (`id`, `x`, `y`) VALUES
  (1, 2, 3), (4, 5, 6), (7, 8, 9)
  ON DUPLICATE KEY UPDATE `x` = VALUES(`x`), `y` = VALUES(`y`);

P.S.: Однако, как подсказывают в комментариях, есть нюанс. В случае этого самого ON DUPLICATE KEY UPDATE автоинкрементное поле для таблиц InnoDB всё равно увеличится, будто была вставка в таблицу.

Laravelajax-запросы и VerifyCsrfToken

Если в бекенде сайта используется фреймворк Laravel и просто так взять и отправить ajax-ом POST-запрос, то ничего не выйдет. Вернее, выйдет, но ошибка наподобие такой:

1
TokenMismatchException in VerifyCsrfToken.php line 46:

Исправить такое очень просто, нужно передать недостающий токен. Чтобы не возиться с токеном в каждом запросе, просто настроим его глобально. Добавим в основной шаблон мета-тег с токеном.

1
2
3
4
5
6
7
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="csrf-token" content="{{ csrf_token() }}">
    <meta name="viewport" content="width=device-width, initial-scale=1">

И установим токен в заголовки по умолчанию.

1
2
3
4
5
$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

LaravelКастомные валидаторы в Laravel

Ниже будет описано создание кастомного валидатора, или, если говорить чуть более по-русски, создание пользовательских правил валидации, c фреймворком Laravel 5. Конечно же всё это описано в документации, но мне этого не полностью хватило. С самим ларавелем я работаю всего неделю, так что не исключено, что записи будут ещё. А вот с основным моим в работе фреймворком, Symfony2, в блоге напряжнее, так как почти всё кажется очевидным и писать не о чем :)

laravel requires ext-mcrypt

PHPактивация PHP-расширений

Поднимая проект на Laravel столкнулся с неожиданной проблемой. А именно, с невозможностью установки вендорских библиотек композером. Неожиданность тут в том, что расширение php5-mcrypt было у меня установлено. Однако composer не обманешь.

Небольшое исследование показало, что необходимое расширение хоть и присутствует, но не подключено. Если же расширение не установлено, то делается это так (в Ubuntu и Debian):

1
sudo apt-get install php5-mcrypt

Но вернёмся к активации установленных расширений...

Ember.jsКомпиляция шаблонов в Ember.js 1.10

Только немного отвлёкся от Ember.js, как в нём внезапно произошли изменения, а именно, сменился движок рендеринга шаблонов. Был Handlebars, а стал какой-то HTMLBars, у которого я даже официального сайта не наблюдаю. Хотя для рядового разработчика ничего не меняется, внешне сами шаблоны остаются почти как есть, основные же отличия во внутренностях.

Если в двух словах, то было и стало.

Раз:

1
2
<script src="/bower_components/handlebars/handlebars.js"></script>
<script src="/bower_components/ember/ember.js"></script>

Два:

1
2
<script src="/bower_components/ember/ember-template-compiler.js"></script>
<script src="/bower_components/ember/ember.js"></script>

Второй момент - это предварительная компиляция *.hbs шаблонов в JavaScript-код. В предыдущей записи, посвящённой Ember.js, использовался модуль ember-precompile, однако сейчас я его даже пробовать не стал, уверен, что ошибки вылезут довольно быстро. Есть же и другие инструменты, рекомендованные на официальном сайте данного фреймворка (здесь).

git diff colors incorrectly

Gitgit diff и FreeBSD

В общеобразовательных целях решил поиграться с FreeBSD и, естественно, установил туда Git. Настроил, как положено, вывод цветов в консоль, т.е.:

1
git config --global color.ui true

И, вроде бы, всё хорошо, однако при использовании команды git diff вывалилась такая печалька на экран.

Решение нагуглилось секунд за 30. Нужно всего лишь установить в конфигурации Git-а правильный пейджер.

1
git config --global core.pager 'less -R'

Вот, собственно, и всё. Можно было и не писать этого всего, но должны же быть тут какие-то заметки :)

Symfony2Symfony2 и Ember.js

Внимание, данная запись устарела. Работоспособность модуля ember-precompile под вопросом начиная с Emberjs 1.9, в связи с переходом на handlebars 2.0.0, а с версии эмбера 1.10+ шаблоны рендерятся с помощью HTMLBars, об этом напишу в ближайшее время.

Эту тему, конечно, в двух словах не опишешь, но попробую. Что это такое и с чем его едят - рассказывать не буду, т.к. раз уж вы сюда попали, то слова эти для вас не пустой звук. Расписывать, почему именно Symfony2 и Ember.js - тоже. Просто так сложилось. Ладно, вступление окончено.

В данной записи будет затронута только серверная часть, хотя не исключено, что когда-нибудь дойдут руки и до статеек по эмберу. Собственно, Symfony-приложение предоставит яваскриптовому приложению REST API, а так же неким образом "подготовит" его и выдаст клиенту в браузер.

ПрограммированиеProject Euler

Давно не писал сюда, надо исправляться :)

Какое-то время назад наткнулся на Projecteuler.net Штука оказалась очень интересная и до сих пор не отпускает. Если в двух словах, то это проект, где размещена куча задач математического и околоматематического характера для программистов, причём решить их надо таким образом, чтобы компьютер затратил на вычисления не больше минуты. Хотя это условие не совсем корректно, т.к. проект родился в 2001-м году, а компьютеры тогда были несколько другие. И список задач продолжает пополняться. В общем, надо придумать такой алгоритм, который работал бы не слишком долго :)

Помимо решения задачек, собственно, задумал на примере этого проекта немного разнообразить свой запас языков программирования, ведь просто так по книжкам изучить их вряд-ли выйдет, будет только казаться, что всё понимаешь, ровно до тех пор, пока не придётся что-то на этом языке “Х” написать. А на Project Euler этого что-то хватает с головой.

Для любопытных создал репозиторий, в дополнение к тысячам других на том же GitHub-е.

profile image

P.S. Присоединяйтесь :) Мой Friend Key, если что, 662120_5b583b32e92f784f26c6bc51a19ce5f0

PostgreSQL

PostgreSQLУстановка PostgreSQL в Mac OS X

Установка будет производится из MacPorts. Можно, конечно, воспользоваться и "родным" приложением, доступным на официальном сайте, но я лично предпочитаю порты, хотя бы из-за своевременных обновлений.

Для начала установим, собственно, PostgreSQL:

1
sudo port install postgresql93