Mercurial > pub > Impl
diff Lib/IMPL/Security/Context.pm @ 230:6d8092d8ce1b
*reworked IMPL::Security
*reworked IMPL::Web::Security
*refactoring
author | sergey |
---|---|
date | Mon, 08 Oct 2012 03:37:37 +0400 |
parents | 4d0e1962161c |
children | b8c724f6de36 |
line wrap: on
line diff
--- a/Lib/IMPL/Security/Context.pm Sat Sep 29 02:34:47 2012 +0400 +++ b/Lib/IMPL/Security/Context.pm Mon Oct 08 03:37:37 2012 +0400 @@ -2,88 +2,45 @@ use strict; use warnings; -use parent qw(IMPL::Object IMPL::Object::Autofill); - -__PACKAGE__->PassThroughArgs; - -use IMPL::Class::Property; - -require IMPL::Security::Principal; +use IMPL::require { + Principal => 'IMPL::Security::Principal', + Role => 'IMPL::Security::Role', + AbstractContext => 'IMPL::Security::AbstractContext', + Exception => 'IMPL::Exception', + ArgumentException => '-IMPL::InvalidArgumentException' + +}; -my $current; -my $nobody; +use IMPL::declare { + base => [ + 'IMPL::Object' => undef, + 'IMPL::Object::Autofill' => undef, + 'IMPL::Security::AbstractContext' => undef, + ], + props => [ + @{AbstractContext->abstractProps()} + ] +}; -BEGIN { - public property principal => prop_get; - public property rolesAssigned => prop_all | prop_list; - public property auth => prop_all; - public property authority => prop_all; -} +__PACKAGE__->abstractProps([]); + + +my $nobody; sub CTOR { my ($this) = @_; - die new IMPL::InvalidArgumentException("The parameter is required", 'principal') unless $this->principal; -} - -sub Impersonate { - my ($this,$code) = @_; - - my $old = $current; - $current = $this; - my $result; - my $e; - - { - local $@; - eval { - $result = $code->(); - }; - $e = $@; - } - $current = $old; - if($e) { - die $e; - } else { - return $result; - } -} - -sub Apply { - my ($this) = @_; - - $current = $this; -} - -sub isTrusted { - my ($this) = @_; - - if (my $auth = $this->auth) { - return $auth->isTrusted; - } else { - return 0; - } + die ArgumentException->new("The parameter is required", 'principal') unless $this->principal; } sub nobody { my ($self) = @_; - $nobody = $self->new(principal => IMPL::Security::Principal->nobody) unless $nobody; + $nobody = $self->new(principal => Principal->nobody) unless $nobody; $nobody; } -sub current { - my ($self) = @_; - - $current = __PACKAGE__->nobody unless $current; - $current; -} - -sub Satisfy { - my ($this,@roles) = @_; - - my $roleEffective = new IMPL::Security::Role ( _effective => scalar $this->rolesAssigned ); - - return $roleEffective->Satisfy(@roles); +sub isTrusted { + return 1; } 1; @@ -94,9 +51,10 @@ =head1 NAME -C<IMPL::Security::Context> - контекст безопасности. +C<IMPL::Security::Context> - реализация контекста безопасности создаваемого в +приложении. -=head1 SINOPSYS +=head1 SYNOPSIS =begin code @@ -108,61 +66,47 @@ } ); +$context = IMPL::Security::Context->new( + principal => $user, + assignedRoles => [ + $backupRole, + $controlRole + ] +); + +$context->Impersonate( + sub { + + # do some authorized operations + + $service->backupData('current.bak'); + $service->stop(); + } +); + =end code =head1 DESCRIPTION -C<[Autofill]> +C<autofill> -Являет собой контекст безопасности, описывает пользователя и привелегии, так же -у программы есть текущий контекст безопасности, по умолчанию он C<nobody>. +Данная реализация контекста безопасности не привязана ни к источнику данных +ни к пакету аутентификации и авторизации, ее приложение может создать в любой +момент, при этом система сама несет ответственность за последствия. + +Данный контекст нужен для выполнения системой служебных функций. =head1 MEMBERS -=over - -=item C<CTOR(%props)> - -Создает объект и заполняет его свойствами. - -=item C<[get] principal> +см. также C<IMPL::Security::AbstractContext>. -Идентификатор пользователя, владельца контекста. - -=item C<[get] rolesAssigned> - -Список назначенных (активных) ролей пользователю. - -=item C<[get] auth> - -Объект асторизации C<IMPL::Security::Auth>, использованный при создании текущего контекста. +=head2 C<CTOR(%props)> -=item C<[static,get] authority> - -Источник данных безопасности, породивший данный контекст. - -=item C<[get] isTrusted> - -Возвращает значение является ли контекст доверенным, тоесть сессия аутетифицирована. - -=item C<Impersonate($code)> +Создает объект и заполняет его свойствами. C<principal> должен быть обязательно +указан. -Делает контекст текущим и выполняет в нем функцию по ссылке C<$code>. По окончании -выполнения, контекст восстанавливается. - -=item C<Apply()> - -Заменяет текущий контекст на себя, но до конца действия метода C<Impersonate>, если -таковой был вызван. - -=item C<[static,get] nobody> +=head2 C<[static,get] nobody> Контекст для неаутентифицированных пользователей, минимум прав. -=item C<[static,get] current> - -Текущий контекст. - -=back - =cut