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 |