Mercurial > pub > Impl
view Lib/IMPL/Web/Security.pm @ 393:69a1f1508696
minor security refactoring
author | cin |
---|---|
date | Fri, 14 Feb 2014 16:41:12 +0400 |
parents | 2287c72f303a |
children |
line wrap: on
line source
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