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