Mercurial > pub > Impl
comparison lib/IMPL/Web/Security.pm @ 407:c6e90e02dd17 ref20150831
renamed Lib->lib
| author | cin |
|---|---|
| date | Fri, 04 Sep 2015 19:40:23 +0300 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| 406:f23fcb19d3c1 | 407:c6e90e02dd17 |
|---|---|
| 1 package IMPL::Web::Security; | |
| 2 use strict; | |
| 3 | |
| 4 use IMPL::Security::Auth qw(:Const); | |
| 5 use IMPL::declare { | |
| 6 require => { | |
| 7 Exception => 'IMPL::Exception', | |
| 8 NotImplementedException => '-IMPL::NotImplementedException', | |
| 9 ArgException => '-IMPL::InvalidArgumentException', | |
| 10 SecurityContext => 'IMPL::Security::AbstractContext' | |
| 11 }, | |
| 12 }; | |
| 13 | |
| 14 use constant { | |
| 15 ERR_NO_SUCH_USER => -1, | |
| 16 ERR_NO_SEC_DATA => -2, | |
| 17 ERR_NO_AUTHORITY => -3, | |
| 18 ERR_NO_SEC_CONTEXT => -4, | |
| 19 ERR_AUTH_FAIL => -5 | |
| 20 }; | |
| 21 | |
| 22 sub interactiveAuthPackage { | |
| 23 die NotImplementedException->new(); | |
| 24 } | |
| 25 | |
| 26 sub users { | |
| 27 die NotImplementedException->new(); | |
| 28 } | |
| 29 | |
| 30 sub roles { | |
| 31 die die NotImplementedException->new(); | |
| 32 } | |
| 33 | |
| 34 sub sessions { | |
| 35 die NotImplementedException->new(); | |
| 36 } | |
| 37 | |
| 38 sub AuthUser { | |
| 39 my ($this,$name,$challenge,$roles,$package) = @_; | |
| 40 | |
| 41 $package ||= $this->interactiveAuthPackage; | |
| 42 $roles ||= []; | |
| 43 | |
| 44 my $user = $this->users->GetById($name) | |
| 45 or return { | |
| 46 status => AUTH_FAIL, | |
| 47 code => ERR_NO_SUCH_USER | |
| 48 }; | |
| 49 | |
| 50 my $auth; | |
| 51 if ( my $secData = $user->GetSecData($package) ) { | |
| 52 $auth = $package->new($secData); | |
| 53 } else { | |
| 54 return { | |
| 55 status => AUTH_FAIL, | |
| 56 code => ERR_NO_SEC_DATA, | |
| 57 user => $user | |
| 58 }; | |
| 59 } | |
| 60 | |
| 61 return { | |
| 62 status => AUTH_FAIL, | |
| 63 code => ERR_NO_SEC_CONTEXT | |
| 64 } unless SecurityContext->current; | |
| 65 | |
| 66 return { | |
| 67 status => AUTH_FAIL, | |
| 68 code => ERR_NO_AUTHORITY | |
| 69 } unless SecurityContext->current->authority; | |
| 70 | |
| 71 my $status = SecurityContext->current->authority->InitSession( | |
| 72 $user, | |
| 73 $roles, | |
| 74 $auth, | |
| 75 $challenge | |
| 76 ); | |
| 77 | |
| 78 return { | |
| 79 status => $status, | |
| 80 code => ($status == AUTH_FAIL ? ERR_AUTH_FAIL : 0), | |
| 81 user => $user | |
| 82 }; | |
| 83 } | |
| 84 | |
| 85 sub Logout { | |
| 86 my ($this) = @_; | |
| 87 | |
| 88 my $session = SecurityContext->current; | |
| 89 if($session && $session->authority) { | |
| 90 $session->authority->CloseSession($session); | |
| 91 | |
| 92 $this->sessions->Delete($session); | |
| 93 } | |
| 94 } | |
| 95 | |
| 96 sub CreateSecData { | |
| 97 my ($this,$package,$params) = @_; | |
| 98 | |
| 99 die ArgException->new(params => 'A hash reference is required') | |
| 100 unless ref($params) eq 'HASH'; | |
| 101 | |
| 102 return $package->CreateSecData(%$params); | |
| 103 } | |
| 104 | |
| 105 1; | |
| 106 | |
| 107 __END__ | |
| 108 | |
| 109 =pod | |
| 110 | |
| 111 =head1 NAME | |
| 112 | |
| 113 C<IMPL::Web::Security> Модуль для аутентификации и авторизации веб запроса. | |
| 114 | |
| 115 =head1 DESCRIPTION | |
| 116 | |
| 117 Текущий модуль обеспечивает функции верхнего уровня для работы с системой | |
| 118 безопасности. Поскольку модуль является абстрактым, конкретные функции | |
| 119 хранения и реализацию объектов модели безопасности должно обеспечить само | |
| 120 приложение. | |
| 121 | |
| 122 Сама система безопасности в веб приложении состоит из двух частей | |
| 123 | |
| 124 =over | |
| 125 | |
| 126 =item Модель системы безопасности | |
| 127 | |
| 128 Предоставляет такие объкты безопасности, как пользователь, сессия роль, | |
| 129 определяет правила проверки прав доступа субъекта к объекту. | |
| 130 | |
| 131 =item Модуль безопасности | |
| 132 | |
| 133 Контекст безопасности создается именно этим модулем. | |
| 134 | |
| 135 Как правило встраивается в транспортный уровеь в виде обработчика | |
| 136 C<IMPL::Web::Handler> и реализует непосредственно протокол аутентификации и | |
| 137 обмена с пользователем. | |
| 138 | |
| 139 Также модуль безопасности использует модель для хранения сессий и данных | |
| 140 аутентификции. | |
| 141 | |
| 142 =back | |
| 143 | |
| 144 =head1 MEMBERS | |
| 145 | |
| 146 =head2 C<AuthUser($name,$package,$challenge)> | |
| 147 | |
| 148 Инициирует создание новой сессии используя провайдера безопасности текущего | |
| 149 контекста безопасности. | |
| 150 | |
| 151 =over | |
| 152 | |
| 153 =item C<$name> | |
| 154 | |
| 155 Имя пользователя, которое будет использоваться при поиске его в БД. | |
| 156 | |
| 157 =item C<$package> | |
| 158 | |
| 159 Имя модуля аутентификации, например, C<IMPL::Security::Auth::Simple>. | |
| 160 | |
| 161 =item C<$challenge> | |
| 162 | |
| 163 Данные, полученные от клиента, которые будут переданы модулю аутентификации для | |
| 164 начала процесса аутентификации и создания сессии. | |
| 165 | |
| 166 =back | |
| 167 | |
| 168 Функция возвращает хеш с элементами | |
| 169 | |
| 170 =over | |
| 171 | |
| 172 =item C<status> | |
| 173 | |
| 174 Статус аутентификации - отражает общее состояние процесса ацтентификации, | |
| 175 | |
| 176 =over | |
| 177 | |
| 178 =item C<AUTH_FAIL> | |
| 179 | |
| 180 Аутентификация неудачная, сессия не создана. | |
| 181 | |
| 182 =item C<AUTH_INCOMPLETE> | |
| 183 | |
| 184 Аутентификация требует дополнительных шагов, сессия создана, но еще не доверена. | |
| 185 | |
| 186 =item C<AUTH_SUCCESS> | |
| 187 | |
| 188 Аутентификация успешно проведена, сессия создана. | |
| 189 | |
| 190 =back | |
| 191 | |
| 192 =item C<code> | |
| 193 | |
| 194 =back | |
| 195 | |
| 196 =cut |
