Модуль CGI::Application::Plugin::Authorization помогает разделить пользователей на различные группы и дать этим группам разные права на выполнение тех или иных режимов приложения.
Скрипт cgi
|
1 2 3 4 5 6 7 8 |
#!/usr/bin/perl use strict; use warnings; use App3; App3->new->run; |
Модуль pm
Есть пользователи user1 и user2. User1 входит в группу group1, а user2 включен в группу group2. Пользователям группы group1 разрешено выполнение режима on_private1, всем остальным — запрещено.
Все это реализовано поверх систем аутентификации и сессий. Пример простой, без использования баз данных и пр., для максимальной наглядности.
|
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 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
package App3; use strict; use warnings; use base 'CGI::Application'; use CGI::Application::Plugin::TT; use CGI::Application::Plugin::Session; use CGI::Application::Plugin::Authentication; use CGI::Application::Plugin::Forward; use CGI::Application::Plugin::Authorization; 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, on_forbidden => \&forbidden, 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 => 'password123', user2 => 'password12345' } ], STORE => 'Session', LOGOUT_RUNMODE => 'on_logout', LOGIN_RUNMODE => 'on_login', POST_LOGIN_RUNMODE => 'on_ok', ); $self->authen->protected_runmodes( 'on_private1', ); # список пользователей и определение их принадлежности к группам my %user_group = ( user1 => 'group1', user2 => 'group2', ); # конфигурирование системы авторизации $self->authz->config( DRIVER => [ 'Generic', sub { my ($username,$group) = @_; return ($user_group{$username} eq $group); } ], # обработчик, который выполнится при попытке # нелегального доступа к защищенным режимам FORBIDDEN_RUNMODE => 'on_forbidden', ); # к режиму on_private1 разрешен доступ только представителям group1 $self->authz->authz_runmodes( on_private1 => 'group1', ); } # подпрограмма будет выполнена при попытке нелегального доступа # к защищенным режимам sub forbidden { my $self = shift; my $tt_params = {}; $tt_params->{block} = 'show_forbidden'; return $self->tt_process('template3.tt', $tt_params); } # выполняется при успешной аутентификации пользователя 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); } # выводит секретную страницу 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) { # если аутентификация успешна - перенаправляем на режим on_private1 return $self->forward('on_private1'); } else { # если аутентификация не успешна - предлагаем повторить попытку return $self->forward('on_start'); } } |
Шаблон 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 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
<!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-%] [%-#-----------------------------------------%] [%-BLOCK show_forbidden-%] [%-#-----------------------------------------%] <p>Forbidden: Вам туды нельзя</p> <form action="app3.cgi" method="POST"> <input type="hidden" name="step" value="on_logout"> <input value="Выйти" type="submit"> </form> [%-#-----------------------------------------%] [%-END-%] |
Полезные ссылки
search.cpan.org: CGI::Application::Plugin::Authorization
search.cpan.org: CGI::Application::Plugin::Authorization::Driver::Generic