230
|
1 package IMPL::Security::AbstractContext;
|
49
|
2 use strict;
|
|
3 use warnings;
|
|
4
|
230
|
5 use IMPL::Const qw(:prop);
|
260
|
6
|
230
|
7 use IMPL::require {
|
260
|
8 Role => 'IMPL::Security::Role',
|
|
9 Exception => 'IMPL::Exception',
|
|
10 NotImplementedException => '-IMPL::NotImplementedException'
|
230
|
11 };
|
49
|
12
|
230
|
13 use parent qw(IMPL::Class::Meta);
|
49
|
14
|
230
|
15 __PACKAGE__->static_accessor_clone(abstractProps => [
|
|
16 principal => PROP_RW,
|
|
17 rolesAssigned => PROP_RW | PROP_LIST,
|
|
18 auth => PROP_RW,
|
|
19 authority => PROP_RW
|
|
20 ]);
|
49
|
21
|
230
|
22 my $current; # current session if any
|
74
|
23
|
49
|
24 sub Impersonate {
|
238
|
25 my ($this,$code,@args) = @_;
|
49
|
26
|
|
27 my $old = $current;
|
97
|
28 $current = $this;
|
49
|
29 my $result;
|
97
|
30 my $e;
|
|
31
|
|
32 {
|
194
|
33 local $@;
|
|
34 eval {
|
238
|
35 $result = $code->(@args);
|
194
|
36 };
|
|
37 $e = $@;
|
97
|
38 }
|
49
|
39 $current = $old;
|
97
|
40 if($e) {
|
|
41 die $e;
|
49
|
42 } else {
|
|
43 return $result;
|
|
44 }
|
|
45 }
|
|
46
|
121
|
47 sub Apply {
|
194
|
48 my ($this) = @_;
|
|
49
|
|
50 $current = $this;
|
121
|
51 }
|
|
52
|
81
|
53 sub isTrusted {
|
194
|
54 my ($this) = @_;
|
|
55
|
|
56 if (my $auth = $this->auth) {
|
|
57 return $auth->isTrusted;
|
|
58 } else {
|
|
59 return 0;
|
|
60 }
|
81
|
61 }
|
|
62
|
230
|
63 sub Satisfy {
|
|
64 my ($this,@roles) = @_;
|
|
65
|
|
66 my $roleEffective = Role->new ( _effective => scalar $this->rolesAssigned );
|
|
67
|
|
68 return $roleEffective->Satisfy(@roles);
|
49
|
69 }
|
|
70
|
74
|
71 sub current {
|
194
|
72 $current;
|
51
|
73 }
|
|
74
|
49
|
75 1;
|
74
|
76
|
|
77 __END__
|
|
78
|
|
79 =pod
|
|
80
|
|
81 =head1 NAME
|
|
82
|
230
|
83 C<abstract IMPL::Security::Context> - контекст безопасности.
|
74
|
84
|
|
85 =head1 SINOPSYS
|
|
86
|
|
87 =begin code
|
|
88
|
230
|
89 package MyApp::Model::Session;
|
|
90 use strict;
|
74
|
91
|
230
|
92 use IMPL::delare {
|
|
93 base => [
|
|
94 'MyApp::Model::BaseDBO' => '@_',
|
|
95 'IMPL::Security::AbstractContext' => undef
|
|
96 ],
|
|
97 props {
|
|
98 IMPL::Security::AbstractContext->abstractProps,
|
|
99 qouta => PROP_GET
|
194
|
100 }
|
230
|
101 }
|
|
102
|
|
103 package main;
|
|
104
|
|
105 $app->model->GetSession('546a54df4')->Impersonate(sub{
|
|
106 # do something
|
|
107 });
|
74
|
108
|
|
109 =end code
|
|
110
|
|
111 =head1 DESCRIPTION
|
|
112
|
230
|
113 Код приложения, которое выполняется
|
74
|
114
|
180
|
115 Являет собой контекст безопасности, описывает пользователя и привелегии, так же
|
|
116 у программы есть текущий контекст безопасности, по умолчанию он C<nobody>.
|
74
|
117
|
|
118 =head1 MEMBERS
|
|
119
|
230
|
120 =head2 C<[get] principal>
|
74
|
121
|
180
|
122 Идентификатор пользователя, владельца контекста.
|
74
|
123
|
260
|
124 =head2 C<[get,set] rolesAssigned>
|
74
|
125
|
260
|
126 Явно назначенные роли. Если список пуст, то считается, что используются роли
|
|
127 пользователя по-умолчанию.
|
74
|
128
|
230
|
129 =head2 C<[get] auth>
|
74
|
130
|
180
|
131 Объект асторизации C<IMPL::Security::Auth>, использованный при создании текущего контекста.
|
74
|
132
|
230
|
133 =head2 C<[get] authority>
|
96
|
134
|
230
|
135 Модуль безопасности, породивший данный контекст. Модуль безопасности, отвечающий
|
|
136 за создание контекста безопасности должен реализовывать метод
|
|
137 C<CreateContext($user,$auth,$roles)>
|
96
|
138
|
230
|
139 =head2 C<[get] isTrusted>
|
81
|
140
|
230
|
141 Возвращает значение является ли контекст доверенным, тоесть клиент
|
|
142 аутентифицирован и сессия установлена. Если C<false> значит, что сессия была
|
|
143 начата, однако не установлена до конца.
|
81
|
144
|
230
|
145 =head2 C<Impersonate($code)>
|
74
|
146
|
180
|
147 Делает контекст текущим и выполняет в нем функцию по ссылке C<$code>. По окончании
|
230
|
148 выполнения, контекст восстанавливается в предыдущий (не зависимо от того, что
|
|
149 с ним происходило во время выполнения C<$code>).
|
74
|
150
|
230
|
151 =head2 C<Apply()>
|
121
|
152
|
180
|
153 Заменяет текущий контекст на себя, но до конца действия метода C<Impersonate>, если
|
|
154 таковой был вызван.
|
121
|
155
|
260
|
156 =head2 C<Satisfy(@roles)>
|
|
157
|
|
158 Проверяет наличие необходимых ролей у контекста. Данный метод позволяет
|
|
159 абстрагироваться от механизмов связи контекста и ролей. Возвращает истинное
|
|
160 значение если список необходимых ролей у пользователя имеется.
|
|
161
|
180
|
162 =cut
|