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
|
74
|
45 sub nobody {
|
49
|
46 my ($self) = @_;
|
68
|
47 $nobody = $self->new(principal => IMPL::Security::Principal->nobody, rolesAssigned => undef) unless $nobody;
|
49
|
48 $nobody;
|
|
49 }
|
|
50
|
74
|
51 sub current {
|
51
|
52 my ($self) = @_;
|
|
53
|
|
54 $current = __PACKAGE__->nobody unless $current;
|
|
55 $current;
|
|
56 }
|
|
57
|
49
|
58 1;
|
74
|
59
|
|
60 __END__
|
|
61
|
|
62 =pod
|
|
63
|
|
64 =head1 NAME
|
|
65
|
|
66 C<IMPL::Security::Context> - контекст безопасности.
|
|
67
|
|
68 =head1 SINOPSYS
|
|
69
|
|
70 =begin code
|
|
71
|
|
72 my $context = IMPL::Security::Context->nobody;
|
|
73
|
|
74 my $result = $context->Impersonate(
|
|
75 sub {
|
|
76 # do some untrusted code
|
|
77 }
|
|
78 );
|
|
79
|
|
80 =end code
|
|
81
|
|
82 =head1 DESCRIPTION
|
|
83
|
|
84 C<[Autofill]>
|
|
85
|
|
86 Являет собой контекст безопасности, описывает пользователя и привелегии, так же
|
|
87 у потока есть текущий контекст безопасности, по умолчанию он C<nobody>.
|
|
88
|
|
89 =head1 MEMBERS
|
|
90
|
|
91 =over
|
|
92
|
|
93 =item C<CTOR(%props)>
|
|
94
|
|
95 Создает объект и заполняет его свойствами.
|
|
96
|
|
97 =item C<[get] principal>
|
|
98
|
|
99 Идентификатор пользователя, владельца контекста.
|
|
100
|
|
101 =item C<[get] rolesAssigned>
|
|
102
|
|
103 Список назначенных (активных) ролей пользователю.
|
|
104
|
|
105 =item C<[get] auth>
|
|
106
|
|
107 Объект асторизации C<IMPL::Security::Auth>, использованный при создании текущего контекста.
|
|
108
|
|
109 =item C<Impersonate($code)>
|
|
110
|
|
111 Делает контекст текущим и выполняет в нем функцию по ссылке C<$code>. По окончании
|
|
112 выполнения, контекст восстанавливается.
|
|
113
|
|
114 =item C<[static,get] nobody>
|
|
115
|
|
116 Контекст для неаутентифицированных пользователей, минимум прав.
|
|
117
|
|
118 =item C<[static,get] current>
|
|
119
|
|
120 Текущий контекст.
|
|
121
|
|
122 =back
|
|
123
|
|
124 =cut |