Mercurial > pub > Impl
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 229:47f77e6409f7 | 230:6d8092d8ce1b |
|---|---|
| 1 package IMPL::Security::Context; | 1 package IMPL::Security::Context; |
| 2 use strict; | 2 use strict; |
| 3 use warnings; | 3 use warnings; |
| 4 | 4 |
| 5 use parent qw(IMPL::Object IMPL::Object::Autofill); | 5 use IMPL::require { |
| 6 Principal => 'IMPL::Security::Principal', | |
| 7 Role => 'IMPL::Security::Role', | |
| 8 AbstractContext => 'IMPL::Security::AbstractContext', | |
| 9 Exception => 'IMPL::Exception', | |
| 10 ArgumentException => '-IMPL::InvalidArgumentException' | |
| 11 | |
| 12 }; | |
| 6 | 13 |
| 7 __PACKAGE__->PassThroughArgs; | 14 use IMPL::declare { |
| 15 base => [ | |
| 16 'IMPL::Object' => undef, | |
| 17 'IMPL::Object::Autofill' => undef, | |
| 18 'IMPL::Security::AbstractContext' => undef, | |
| 19 ], | |
| 20 props => [ | |
| 21 @{AbstractContext->abstractProps()} | |
| 22 ] | |
| 23 }; | |
| 8 | 24 |
| 9 use IMPL::Class::Property; | 25 __PACKAGE__->abstractProps([]); |
| 10 | 26 |
| 11 require IMPL::Security::Principal; | |
| 12 | 27 |
| 13 my $current; | |
| 14 my $nobody; | 28 my $nobody; |
| 15 | |
| 16 BEGIN { | |
| 17 public property principal => prop_get; | |
| 18 public property rolesAssigned => prop_all | prop_list; | |
| 19 public property auth => prop_all; | |
| 20 public property authority => prop_all; | |
| 21 } | |
| 22 | 29 |
| 23 sub CTOR { | 30 sub CTOR { |
| 24 my ($this) = @_; | 31 my ($this) = @_; |
| 25 | 32 |
| 26 die new IMPL::InvalidArgumentException("The parameter is required", 'principal') unless $this->principal; | 33 die ArgumentException->new("The parameter is required", 'principal') unless $this->principal; |
| 27 } | |
| 28 | |
| 29 sub Impersonate { | |
| 30 my ($this,$code) = @_; | |
| 31 | |
| 32 my $old = $current; | |
| 33 $current = $this; | |
| 34 my $result; | |
| 35 my $e; | |
| 36 | |
| 37 { | |
| 38 local $@; | |
| 39 eval { | |
| 40 $result = $code->(); | |
| 41 }; | |
| 42 $e = $@; | |
| 43 } | |
| 44 $current = $old; | |
| 45 if($e) { | |
| 46 die $e; | |
| 47 } else { | |
| 48 return $result; | |
| 49 } | |
| 50 } | |
| 51 | |
| 52 sub Apply { | |
| 53 my ($this) = @_; | |
| 54 | |
| 55 $current = $this; | |
| 56 } | |
| 57 | |
| 58 sub isTrusted { | |
| 59 my ($this) = @_; | |
| 60 | |
| 61 if (my $auth = $this->auth) { | |
| 62 return $auth->isTrusted; | |
| 63 } else { | |
| 64 return 0; | |
| 65 } | |
| 66 } | 34 } |
| 67 | 35 |
| 68 sub nobody { | 36 sub nobody { |
| 69 my ($self) = @_; | 37 my ($self) = @_; |
| 70 $nobody = $self->new(principal => IMPL::Security::Principal->nobody) unless $nobody; | 38 $nobody = $self->new(principal => Principal->nobody) unless $nobody; |
| 71 $nobody; | 39 $nobody; |
| 72 } | 40 } |
| 73 | 41 |
| 74 sub current { | 42 sub isTrusted { |
| 75 my ($self) = @_; | 43 return 1; |
| 76 | |
| 77 $current = __PACKAGE__->nobody unless $current; | |
| 78 $current; | |
| 79 } | |
| 80 | |
| 81 sub Satisfy { | |
| 82 my ($this,@roles) = @_; | |
| 83 | |
| 84 my $roleEffective = new IMPL::Security::Role ( _effective => scalar $this->rolesAssigned ); | |
| 85 | |
| 86 return $roleEffective->Satisfy(@roles); | |
| 87 } | 44 } |
| 88 | 45 |
| 89 1; | 46 1; |
| 90 | 47 |
| 91 __END__ | 48 __END__ |
| 92 | 49 |
| 93 =pod | 50 =pod |
| 94 | 51 |
| 95 =head1 NAME | 52 =head1 NAME |
| 96 | 53 |
| 97 C<IMPL::Security::Context> - контекст безопасности. | 54 C<IMPL::Security::Context> - реализация контекста безопасности создаваемого в |
| 55 приложении. | |
| 98 | 56 |
| 99 =head1 SINOPSYS | 57 =head1 SYNOPSIS |
| 100 | 58 |
| 101 =begin code | 59 =begin code |
| 102 | 60 |
| 103 my $context = IMPL::Security::Context->nobody; | 61 my $context = IMPL::Security::Context->nobody; |
| 104 | 62 |
| 106 sub { | 64 sub { |
| 107 # do some untrusted code | 65 # do some untrusted code |
| 108 } | 66 } |
| 109 ); | 67 ); |
| 110 | 68 |
| 69 $context = IMPL::Security::Context->new( | |
| 70 principal => $user, | |
| 71 assignedRoles => [ | |
| 72 $backupRole, | |
| 73 $controlRole | |
| 74 ] | |
| 75 ); | |
| 76 | |
| 77 $context->Impersonate( | |
| 78 sub { | |
| 79 | |
| 80 # do some authorized operations | |
| 81 | |
| 82 $service->backupData('current.bak'); | |
| 83 $service->stop(); | |
| 84 } | |
| 85 ); | |
| 86 | |
| 111 =end code | 87 =end code |
| 112 | 88 |
| 113 =head1 DESCRIPTION | 89 =head1 DESCRIPTION |
| 114 | 90 |
| 115 C<[Autofill]> | 91 C<autofill> |
| 116 | 92 |
| 117 Являет собой контекст безопасности, описывает пользователя и привелегии, так же | 93 Данная реализация контекста безопасности не привязана ни к источнику данных |
| 118 у программы есть текущий контекст безопасности, по умолчанию он C<nobody>. | 94 ни к пакету аутентификации и авторизации, ее приложение может создать в любой |
| 95 момент, при этом система сама несет ответственность за последствия. | |
| 96 | |
| 97 Данный контекст нужен для выполнения системой служебных функций. | |
| 119 | 98 |
| 120 =head1 MEMBERS | 99 =head1 MEMBERS |
| 121 | 100 |
| 122 =over | 101 см. также C<IMPL::Security::AbstractContext>. |
| 123 | 102 |
| 124 =item C<CTOR(%props)> | 103 =head2 C<CTOR(%props)> |
| 125 | 104 |
| 126 Создает объект и заполняет его свойствами. | 105 Создает объект и заполняет его свойствами. C<principal> должен быть обязательно |
| 106 указан. | |
| 127 | 107 |
| 128 =item C<[get] principal> | 108 =head2 C<[static,get] nobody> |
| 129 | |
| 130 Идентификатор пользователя, владельца контекста. | |
| 131 | |
| 132 =item C<[get] rolesAssigned> | |
| 133 | |
| 134 Список назначенных (активных) ролей пользователю. | |
| 135 | |
| 136 =item C<[get] auth> | |
| 137 | |
| 138 Объект асторизации C<IMPL::Security::Auth>, использованный при создании текущего контекста. | |
| 139 | |
| 140 =item C<[static,get] authority> | |
| 141 | |
| 142 Источник данных безопасности, породивший данный контекст. | |
| 143 | |
| 144 =item C<[get] isTrusted> | |
| 145 | |
| 146 Возвращает значение является ли контекст доверенным, тоесть сессия аутетифицирована. | |
| 147 | |
| 148 =item C<Impersonate($code)> | |
| 149 | |
| 150 Делает контекст текущим и выполняет в нем функцию по ссылке C<$code>. По окончании | |
| 151 выполнения, контекст восстанавливается. | |
| 152 | |
| 153 =item C<Apply()> | |
| 154 | |
| 155 Заменяет текущий контекст на себя, но до конца действия метода C<Impersonate>, если | |
| 156 таковой был вызван. | |
| 157 | |
| 158 =item C<[static,get] nobody> | |
| 159 | 109 |
| 160 Контекст для неаутентифицированных пользователей, минимум прав. | 110 Контекст для неаутентифицированных пользователей, минимум прав. |
| 161 | 111 |
| 162 =item C<[static,get] current> | |
| 163 | |
| 164 Текущий контекст. | |
| 165 | |
| 166 =back | |
| 167 | |
| 168 =cut | 112 =cut |
