| 49 | 1 package IMPL::Security::Context; | 
|  | 2 use strict; | 
|  | 3 use warnings; | 
|  | 4 | 
| 74 | 5 use base qw(IMPL::Object IMPL::Object::Autofill); | 
|  | 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; | 
| 49 | 20 } | 
|  | 21 | 
| 74 | 22 sub CTOR { | 
|  | 23 	my ($this) = @_; | 
|  | 24 | 
|  | 25 	die new IMPL::InvalidArgumentException("The parameter is required", 'principal') unless $this->principal; | 
|  | 26 } | 
|  | 27 | 
| 49 | 28 sub Impersonate { | 
|  | 29     my ($this,$code) = @_; | 
|  | 30 | 
|  | 31     my $old = $current; | 
|  | 32     my $result; | 
|  | 33     local $@; | 
|  | 34     eval { | 
|  | 35         $result = $code->(); | 
|  | 36     }; | 
|  | 37     $current = $old; | 
|  | 38     if($@) { | 
|  | 39         die $@; | 
|  | 40     } else { | 
|  | 41         return $result; | 
|  | 42     } | 
|  | 43 } | 
|  | 44 | 
| 81 | 45 sub isTrusted { | 
|  | 46 	my ($this) = @_; | 
|  | 47 | 
|  | 48 	if (my $auth = $this->auth) { | 
|  | 49 		return $auth->isTrusted; | 
|  | 50 	} else { | 
|  | 51 		return 0; | 
|  | 52 	} | 
|  | 53 } | 
|  | 54 | 
| 74 | 55 sub nobody { | 
| 49 | 56     my ($self) = @_; | 
| 68 | 57     $nobody = $self->new(principal => IMPL::Security::Principal->nobody, rolesAssigned => undef) unless $nobody; | 
| 49 | 58     $nobody; | 
|  | 59 } | 
|  | 60 | 
| 74 | 61 sub current { | 
| 51 | 62 	my ($self) = @_; | 
|  | 63 | 
|  | 64 	$current = __PACKAGE__->nobody unless $current; | 
|  | 65 	$current; | 
|  | 66 } | 
|  | 67 | 
| 49 | 68 1; | 
| 74 | 69 | 
|  | 70 __END__ | 
|  | 71 | 
|  | 72 =pod | 
|  | 73 | 
|  | 74 =head1 NAME | 
|  | 75 | 
|  | 76 C<IMPL::Security::Context> - контекст безопасности. | 
|  | 77 | 
|  | 78 =head1 SINOPSYS | 
|  | 79 | 
|  | 80 =begin code | 
|  | 81 | 
|  | 82 my $context = IMPL::Security::Context->nobody; | 
|  | 83 | 
|  | 84 my $result = $context->Impersonate( | 
|  | 85 	sub { | 
|  | 86 		# do some untrusted code | 
|  | 87 	} | 
|  | 88 ); | 
|  | 89 | 
|  | 90 =end code | 
|  | 91 | 
|  | 92 =head1 DESCRIPTION | 
|  | 93 | 
|  | 94 C<[Autofill]> | 
|  | 95 | 
|  | 96 Являет собой контекст безопасности, описывает пользователя и привелегии, так же | 
|  | 97 у потока есть текущий контекст безопасности, по умолчанию он C<nobody>. | 
|  | 98 | 
|  | 99 =head1 MEMBERS | 
|  | 100 | 
|  | 101 =over | 
|  | 102 | 
|  | 103 =item C<CTOR(%props)> | 
|  | 104 | 
|  | 105 Создает объект и заполняет его свойствами. | 
|  | 106 | 
|  | 107 =item C<[get] principal> | 
|  | 108 | 
|  | 109 Идентификатор пользователя, владельца контекста. | 
|  | 110 | 
|  | 111 =item C<[get] rolesAssigned> | 
|  | 112 | 
|  | 113 Список назначенных (активных) ролей пользователю. | 
|  | 114 | 
|  | 115 =item C<[get] auth> | 
|  | 116 | 
|  | 117 Объект асторизации C<IMPL::Security::Auth>, использованный при создании текущего контекста. | 
|  | 118 | 
| 81 | 119 =item C<[get] isTrusted> | 
|  | 120 | 
|  | 121 Возвращает значение является ли контекст доверенным, тоесть сессия аутетифицирована. | 
|  | 122 | 
| 74 | 123 =item C<Impersonate($code)> | 
|  | 124 | 
|  | 125 Делает контекст текущим и выполняет в нем функцию по ссылке C<$code>. По окончании | 
|  | 126 выполнения, контекст восстанавливается. | 
|  | 127 | 
|  | 128 =item C<[static,get] nobody> | 
|  | 129 | 
|  | 130 Контекст для неаутентифицированных пользователей, минимум прав. | 
|  | 131 | 
|  | 132 =item C<[static,get] current> | 
|  | 133 | 
|  | 134 Текущий контекст. | 
|  | 135 | 
|  | 136 =back | 
|  | 137 | 
|  | 138 =cut |