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
|
94
|
68 sub Satisfy {
|
|
69 my ($this,@roles) = @_;
|
|
70
|
|
71 my $roleEffective = new IMPL::Security::Role ( _effective => $this->rolesAssigned );
|
|
72
|
|
73 return $roleEffective->Satisfy(@roles);
|
|
74 }
|
|
75
|
49
|
76 1;
|
74
|
77
|
|
78 __END__
|
|
79
|
|
80 =pod
|
|
81
|
|
82 =head1 NAME
|
|
83
|
|
84 C<IMPL::Security::Context> - контекст безопасности.
|
|
85
|
|
86 =head1 SINOPSYS
|
|
87
|
|
88 =begin code
|
|
89
|
|
90 my $context = IMPL::Security::Context->nobody;
|
|
91
|
|
92 my $result = $context->Impersonate(
|
|
93 sub {
|
|
94 # do some untrusted code
|
|
95 }
|
|
96 );
|
|
97
|
|
98 =end code
|
|
99
|
|
100 =head1 DESCRIPTION
|
|
101
|
|
102 C<[Autofill]>
|
|
103
|
|
104 Являет собой контекст безопасности, описывает пользователя и привелегии, так же
|
|
105 у потока есть текущий контекст безопасности, по умолчанию он C<nobody>.
|
|
106
|
|
107 =head1 MEMBERS
|
|
108
|
|
109 =over
|
|
110
|
|
111 =item C<CTOR(%props)>
|
|
112
|
|
113 Создает объект и заполняет его свойствами.
|
|
114
|
|
115 =item C<[get] principal>
|
|
116
|
|
117 Идентификатор пользователя, владельца контекста.
|
|
118
|
|
119 =item C<[get] rolesAssigned>
|
|
120
|
|
121 Список назначенных (активных) ролей пользователю.
|
|
122
|
|
123 =item C<[get] auth>
|
|
124
|
|
125 Объект асторизации C<IMPL::Security::Auth>, использованный при создании текущего контекста.
|
|
126
|
81
|
127 =item C<[get] isTrusted>
|
|
128
|
|
129 Возвращает значение является ли контекст доверенным, тоесть сессия аутетифицирована.
|
|
130
|
74
|
131 =item C<Impersonate($code)>
|
|
132
|
|
133 Делает контекст текущим и выполняет в нем функцию по ссылке C<$code>. По окончании
|
|
134 выполнения, контекст восстанавливается.
|
|
135
|
|
136 =item C<[static,get] nobody>
|
|
137
|
|
138 Контекст для неаутентифицированных пользователей, минимум прав.
|
|
139
|
|
140 =item C<[static,get] current>
|
|
141
|
|
142 Текущий контекст.
|
|
143
|
|
144 =back
|
|
145
|
|
146 =cut |