Создание модели DBI в Catalyst. Использование DBI-модели. Реализация системы сессий в Catalyst, с помощью плагинов Catalyst::Plugin::Session::PerUser, Catalyst::Plugin::Session::Store::DBI, Catalyst::Plugin::Session::State::Cookie. Примеры кода, скриншоты.
Ввиду того, что VPS от REG.RU с некоторых пор убивает все процессы cpan на установку новых модулей, а новый хороший сервер для тестирования пока не найден, система авторизации разрабатывалась под Windows-окружением.
Создание системы сессий, авторизации и аутентификации в Catalyst. Часть 2. Аутентификация и авторизация
Создание системы сессий, авторизации и аутентификации в Catalyst. Часть 3. Роли пользователей
Создание модели DBI
1. Устанавливаем модуль Catalyst::Model::DBI
|
1 |
cpan install Catalyst::Model::DBI |
2.Создаем модель для работы с mysql.
lib/app/Model/DBI.pm :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
package app::Model::DBI; use strict; use base 'Catalyst::Model::DBI'; use VKino::Config; __PACKAGE__->config( dsn => 'DBI:mysql:dbname=test;host=localhost', username => 'root', password => '', options => { AutoCommit => 1 }, loglevel => 1 ); 1; |
DBIx было решено не использовать, т.к. в нагруженном проекте он не желателен, тормозит всю систему. Лучше даже не привыкать.
3. Создаем страничку, которая выведет хоть что-то из БД, чтобы проверить работоспособность модели.
lib/app/Controller/Root.pm :
|
1 2 3 4 5 6 7 8 9 10 11 12 |
sub index :Path :Args(0) { my ( $self, $c ) = @_; my $dbh = $c->model( 'DBI' )->dbh; my $articles = $dbh->selectall_arrayref( "select * from articles order by id", { Slice => {} } ); $c->stash( articles => $articles ); $c->stash->{template} = 'index.tt'; $c->forward('View::TT'); } |
root/src/index.tt :
|
1 2 3 |
[% FOREACH article = articles %] [% article.name %] - [% article.full %]<br> [% END %] |
Добавление сессий в Catalyst-приложение
1. Устанавливаем сессионные модули.
|
1 2 3 |
cpan force install Catalyst::Plugin::Session::Store::DBI force install Catalyst::Plugin::Session::State::Cookie |
2. Создаем таблицу в БД.
|
1 2 3 4 5 |
CREATE TABLE sessions ( id char(72) primary key, session_data text, expires int(10) ); |
Сессия - это некоторый идентификатор и набор данных, индивидуальный для каждого пользователя. Она позволяет идентифицировать пользователя, не заставляя его вводить свой логин/пароль, и другие данные,
при переходе на каждую страницу. Идентификатор сессии передается пользователю, и при каждом запросе, браузер возвращает заданный ID, позволяя опознавать пользователя. Традиционно, со стороны клиента для хранения ID сессии используются Cookies.
Catalyst использует два типа плагинов для работы с сессиями:
- State - отвечает за отправку ID сессии браузеру, получение ID от браузера, выясняет состояние сессии и т.п.
- Store - отвечает за хранение сессионных данных на стороне сервера. Для хранения могут использоваться файлы, база данных, память.
Как только вы подключаете сессионные модули в Catalyst, аутентификационная система автоматически начинает их использовать. Данные сессии будут доступны через $c->session . Для чтения и записи данных, можно использовать $c->session как обычный хэш.
3. Редактируем файл lib/app.pm, добавляем в список модули сессий и конфигурационные данные для хранения сессий со стороны сервера:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
use Catalyst qw/ ... Session Session::PerUser Session::Store::DBI Session::State::Cookie /; __PACKAGE__->config( ... 'Plugin::Session' => { expires => 3600, dbi_dsn => 'DBI:mysql:dbname=test;host=localhost', dbi_user => 'root', dbi_pass => '', dbi_table => 'sessions', dbi_id_field => 'id', dbi_data_field => 'session_data', dbi_expires_field => 'expires', } ); |
Для хранения сессий в приведенном примере был использован DBI и база данных mysql, но в реальных условиях нагруженных систем, это не лучший выбор. Существует множество плагинов Catalyst для хранения сессионных данных: Catalyst::Plugin::Session::Store::Redis, Catalyst::Plugin::Session::Store::MongoDB, Catalyst::Plugin::Session::Store::Memcached::Fast и другие. При проектировании реальной системы лучше использовать Memcached.
4. Создаем новый контроллер.
|
1 |
perl script/app_create.pl controller Auction |
5. Проверяем работоспособность сессий.
lib/app/Controller/Root.pm :
|
1 2 3 4 5 |
sub index :Path :Args(0) { ... $c->session->{gift} = 1; ... } |
lib/app/Controller/Auction.pm :
|
1 2 3 4 5 6 7 8 |
sub index :Path :Args(0) { my ( $self, $c ) = @_; $c->stash->{gift} = $c->session->{gift}; $c->stash->{template} = 'auction/index.tt'; $c->forward('View::TT'); } |
root/src/auction/index.tt :
|
1 2 |
Auction list [% gift %] |
Запускаем сервер. Сначала заходим на страницу http://localhost:3000/ - на ней в нашу сессию будет добавлен флаг подарка, который мы сможем использовать позднее.
Затем идем на страницу http://localhost:3000/auction - там будет выводиться флаг подарка, как демонстрация работы сессий.
В cookies браузера будет добавлено:

В БД появится новая запись:

Полезные ссылки по теме сессий Catalyst
search.cpan.org: Catalyst::Plugin::Session::PerUser
search.cpan.org: Catalyst::Plugin::Session::Store::DBI
search.cpan.org: Catalyst::Model::DBI
search.cpan.org: Catalyst::Plugin::Session::State::Cookie