Это очень простой пример, с минимально возможным использованием различных дополнительных модулей.
Хорошо подходит для демонстрации работы CGI::Application::Plugin::Authentication, алгоритм которого, кстати, весьма не очевиден. Впрочем, возможно, требуется только привычка.
Скрипт cgi
|
1 2 3 4 5 6 7 |
#!/usr/bin/perl use strict; use warnings; use App3; App3->new->run; |
Модуль pm
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
package App3; use strict; use warnings; use base 'CGI::Application'; use CGI::Application::Plugin::TT; use CGI::Session::Driver::file; use CGI::Application::Plugin::Session; use CGI::Application::Plugin::Authentication; use CGI::Application::Plugin::Forward; sub setup { my $self = shift; $self->mode_param('step'); $self->start_mode('on_start'); $self->run_modes( on_start => \&start, on_logout => \&logout, on_login => \&login, on_ok => \&ok, on_private1 => \&private1, AUTOLOAD => sub { return 'Запрошенной страницы не существует' } ); } sub cgiapp_init { my $self = shift; # после аутентификации в сессию будет добавлена информация о клиенте $self->session_config( CGI_SESSION_OPTIONS => [ "driver:File", $self->query, {Directory=>'/dev-lab/tmp'} ], DEFAULT_EXPIRY => '+1w', COOKIE_PARAMS => { -expires => '+24h', -path => '/', }, SEND_COOKIE => 1, ); # задаем настройки аутентификации $self->authen->config( DRIVER => [ 'Generic', { user1 => '123' } ], STORE => 'Session', LOGOUT_RUNMODE => 'on_logout', LOGIN_RUNMODE => 'on_login', POST_LOGIN_RUNMODE => 'on_ok', ); # эти режимы будут доступны только прошедшим аутентификацию клиентам $self->authen->protected_runmodes( 'on_private1', ); } # подпрограмма выполнится, если клиент указал корректные логин и пароль sub ok { my $self = shift; my $tt_params = {}; $tt_params->{block} = 'show_ok_page'; return $self->tt_process('template3.tt', $tt_params); } sub start { my $self = shift; my $q = $self->query(); my $tt_params = {}; my $user = $self->authen->username; if ($user) { # клиент опознан. Можно показать что-то особенное return $self->forward('on_private1'); } # клиент не опознан, выводим форму для аутентификации $tt_params->{block} = 'show_index_page'; return $self->tt_process('template3.tt', $tt_params); } # если клиент не опознан, вместо этой подпрограммы сработает login() sub private1 { my $self = shift; my $tt_params = {}; $tt_params->{block} = 'show_private_page'; return $self->tt_process('template3.tt', $tt_params); } # завершение сеанса работы sub logout { my $self = shift; my $tt_params = {}; if ($self->authen->username) { $self->authen->logout; $self->session_delete; } $tt_params->{block} = 'show_close_session_page'; return $self->tt_process('template3.tt', $tt_params); } # аутентификация sub login { my $self = shift; if ($self->authen->username) { # клиент опознан. Можно показать что-то особенное return $self->forward('on_private1'); } else { # клиент не опознан. Оn_start выведет ему # форму для аутентификации return $self->forward('on_start'); } } 1; |
Шаблон tt
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" /> <title>session</title> </head> <body> <h1>Session</h1> [%- TRY -%] [%-INCLUDE $block-%] [%- CATCH -%] Ошибочка вышла [%- END -%] </body> </html> [%-#-----------------------------------------%] [%-BLOCK show_index_page-%] [%-#-----------------------------------------%] <form action="app3.cgi" method="POST"> <input type="hidden" name="step" value="on_login"> Логин <input type="text" size="10" name="authen_username" maxlength="40"> <br> Пароль <input type="text" size="10" name="authen_password" maxlength="20"> <br> <input value="Войти" type="submit"> </form> [%-#-----------------------------------------%] [%-END-%] [%-#-----------------------------------------%] [%-BLOCK show_private_page-%] [%-#-----------------------------------------%] <p>Эта страница только для авторизованных пользователей</p> <form action="app3.cgi" method="POST"> <input type="hidden" name="step" value="on_logout"> <input value="Выйти" type="submit"> </form> [%-#-----------------------------------------%] [%-END-%] [%-#-----------------------------------------%] [%-BLOCK show_close_session_page-%] [%-#-----------------------------------------%] <p>Ваша сессия завершена. До свидания!</p> [%-#-----------------------------------------%] [%-END-%] [%-#-----------------------------------------%] [%-BLOCK show_ok_page-%] [%-#-----------------------------------------%] <p>Вы успешно авторизованы! Можете посмотреть специальные страницы.</p> <a href="app3.cgi?step=on_private1">Private page</a> [%-#-----------------------------------------%] [%-END-%] |
А тем временем… Содержимое сессионного файла
В приведенном примере, сессионные данные хранятся в файле, который создается по адресу /dev-lab/tmp. После аутентификации, в этот же самый файл помещается информация о ней.
cgisess_855e6124edd2c938d06bb9b837e1075b:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$D = { '_SESSION_ID' => '855e6124edd2c938d06bb9b837e1075b', '_SESSION_ETIME' => 604800, '_SESSION_REMOTE_ADDR' => '127.0.0.1', '_SESSION_CTIME' => 1290694127, '_SESSION_ATIME' => 1290694135, '_SESSION_EXPIRE_LIST' => {}, 'AUTH_LAST_LOGIN' => 1290694135, 'AUTH_LAST_ACCESS' => 1290694135, 'AUTH_USERNAME' => 'user1', 'AUTH_LOGIN_ATTEMPTS' => 0 } ;;$D |