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