Mercurial > pub > Impl
diff lib/IMPL/Web/Security.pm @ 407:c6e90e02dd17 ref20150831
renamed Lib->lib
author | cin |
---|---|
date | Fri, 04 Sep 2015 19:40:23 +0300 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/IMPL/Web/Security.pm Fri Sep 04 19:40:23 2015 +0300 @@ -0,0 +1,196 @@ +package IMPL::Web::Security; +use strict; + +use IMPL::Security::Auth qw(:Const); +use IMPL::declare { + require => { + Exception => 'IMPL::Exception', + NotImplementedException => '-IMPL::NotImplementedException', + ArgException => '-IMPL::InvalidArgumentException', + SecurityContext => 'IMPL::Security::AbstractContext' + }, +}; + +use constant { + ERR_NO_SUCH_USER => -1, + ERR_NO_SEC_DATA => -2, + ERR_NO_AUTHORITY => -3, + ERR_NO_SEC_CONTEXT => -4, + ERR_AUTH_FAIL => -5 +}; + +sub interactiveAuthPackage { + die NotImplementedException->new(); +} + +sub users { + die NotImplementedException->new(); +} + +sub roles { + die die NotImplementedException->new(); +} + +sub sessions { + die NotImplementedException->new(); +} + +sub AuthUser { + my ($this,$name,$challenge,$roles,$package) = @_; + + $package ||= $this->interactiveAuthPackage; + $roles ||= []; + + my $user = $this->users->GetById($name) + or return { + status => AUTH_FAIL, + code => ERR_NO_SUCH_USER + }; + + my $auth; + if ( my $secData = $user->GetSecData($package) ) { + $auth = $package->new($secData); + } else { + return { + status => AUTH_FAIL, + code => ERR_NO_SEC_DATA, + user => $user + }; + } + + return { + status => AUTH_FAIL, + code => ERR_NO_SEC_CONTEXT + } unless SecurityContext->current; + + return { + status => AUTH_FAIL, + code => ERR_NO_AUTHORITY + } unless SecurityContext->current->authority; + + my $status = SecurityContext->current->authority->InitSession( + $user, + $roles, + $auth, + $challenge + ); + + return { + status => $status, + code => ($status == AUTH_FAIL ? ERR_AUTH_FAIL : 0), + user => $user + }; +} + +sub Logout { + my ($this) = @_; + + my $session = SecurityContext->current; + if($session && $session->authority) { + $session->authority->CloseSession($session); + + $this->sessions->Delete($session); + } +} + +sub CreateSecData { + my ($this,$package,$params) = @_; + + die ArgException->new(params => 'A hash reference is required') + unless ref($params) eq 'HASH'; + + return $package->CreateSecData(%$params); +} + +1; + +__END__ + +=pod + +=head1 NAME + +C<IMPL::Web::Security> Модуль для аутентификации и авторизации веб запроса. + +=head1 DESCRIPTION + +Текущий модуль обеспечивает функции верхнего уровня для работы с системой +безопасности. Поскольку модуль является абстрактым, конкретные функции +хранения и реализацию объектов модели безопасности должно обеспечить само +приложение. + +Сама система безопасности в веб приложении состоит из двух частей + +=over + +=item Модель системы безопасности + +Предоставляет такие объкты безопасности, как пользователь, сессия роль, +определяет правила проверки прав доступа субъекта к объекту. + +=item Модуль безопасности + +Контекст безопасности создается именно этим модулем. + +Как правило встраивается в транспортный уровеь в виде обработчика +C<IMPL::Web::Handler> и реализует непосредственно протокол аутентификации и +обмена с пользователем. + +Также модуль безопасности использует модель для хранения сессий и данных +аутентификции. + +=back + +=head1 MEMBERS + +=head2 C<AuthUser($name,$package,$challenge)> + +Инициирует создание новой сессии используя провайдера безопасности текущего +контекста безопасности. + +=over + +=item C<$name> + +Имя пользователя, которое будет использоваться при поиске его в БД. + +=item C<$package> + +Имя модуля аутентификации, например, C<IMPL::Security::Auth::Simple>. + +=item C<$challenge> + +Данные, полученные от клиента, которые будут переданы модулю аутентификации для +начала процесса аутентификации и создания сессии. + +=back + +Функция возвращает хеш с элементами + +=over + +=item C<status> + +Статус аутентификации - отражает общее состояние процесса ацтентификации, + +=over + +=item C<AUTH_FAIL> + +Аутентификация неудачная, сессия не создана. + +=item C<AUTH_INCOMPLETE> + +Аутентификация требует дополнительных шагов, сессия создана, но еще не доверена. + +=item C<AUTH_SUCCESS> + +Аутентификация успешно проведена, сессия создана. + +=back + +=item C<code> + +=back + +=cut