comparison Lib/IMPL/Security.pm @ 371:d5c8b955bf8d

refactoring
author cin
date Fri, 13 Dec 2013 16:49:47 +0400
parents 814d755e5d12
children
comparison
equal deleted inserted replaced
370:cbf4febf0930 371:d5c8b955bf8d
11 Principal => 'IMPL::Security::Principal', 11 Principal => 'IMPL::Security::Principal',
12 AbstractContext => 'IMPL::Security::AbstractContext', 12 AbstractContext => 'IMPL::Security::AbstractContext',
13 Context => 'IMPL::Security::Context' 13 Context => 'IMPL::Security::Context'
14 }; 14 };
15 15
16 our @RULES;
17
18 sub AccessCheck {
19 my ($self, $object, $desiredAccess, $context) = @_;
20
21 $context ||= $self->context;
22
23 $_->($self,$object,$desiredAccess,$context) or return 0 foreach @{$self->Rules};
24
25 return 1;
26 }
27
28 sub Take {
29 my ($self,$principal,$refRoles) = @_;
30
31 die new IMPL::NotImplementedException();
32 }
33
34 sub MakeContext {
35 my ($this,$principal,$refRoles,$auth) = @_;
36
37 return Context->new(
38 principal => $principal,
39 rolesAssigned => $refRoles,
40 auth => $auth
41 );
42 }
43
44 sub Rules {
45 return \@RULES;
46 }
47
48 sub principal { 16 sub principal {
49 return 17 return
50 AbstractContext->current 18 AbstractContext->current
51 && AbstractContext->current->principal 19 && AbstractContext->current->principal
52 || Principal->nobody; 20 || Principal->nobody;
57 } 25 }
58 26
59 1; 27 1;
60 28
61 __END__ 29 __END__
62
63 =pod
64
65 =head1 NAME
66
67 C<IMPL::Security> - Модуль для работы с функциями авторизации и аутентификации.
68
69 =head1 SINOPSYS
70
71 =begin code
72
73 use IMPL::Security;
74
75 my Method {
76 my $this = shift;
77
78 # access check in the current context, using standard configuration
79 IMPL::Security->AccessCheck($this,'Method') or die new IMPL::AccessDeniedException("Access is denied");
80
81 #some more results
82 }
83
84 my DelegationMethod {
85
86 my $this = shift;
87
88 #forced delegation
89 my $delegatedContext = IMPL::Security::Context->new(
90 principal => IMPL::Security::Principal->new(
91 name => 'suser'
92 ),
93 rolesAssigned => ['administrator']
94 )
95
96 my $result;
97
98 $delegatedContext->Impersonate(sub{
99 $result = $this->Method();
100 });
101
102 return $result;
103 }
104
105 my SafeDelegationMethod {
106
107 my $this = shift;
108
109 my $delegatedContext = IMPL::Security->Take( suser => 'administrator' );
110
111 my $result;
112
113 $delegatedContext->Impersonate(sub{
114 $result = $this->Method();
115 });
116
117 return $result;
118 }
119
120 =end code
121
122 =head1 DESCRIPTION
123
124 Модуль для инфраструктуры безопасности, реализует основные функции для авторизации
125 и аутентификации пользователей.
126
127 Модуль аутентификации, реализиция которого зависит от приложения, аутентифицирует
128 пользователя, при этом создается контекст безопасности, который содержит
129 идентификатор пользователя и список активных ролей.
130
131 При проверке прав доступа происходит последовательная проверка правил доступа,
132 если все правила выполнены, то доступ разрешается.
133
134 =head1 MEMBERS
135
136 =over
137
138 =item C<AccessCheck($object,$desiredAccess,$context)>
139
140 Метод. Проверка доступа к объекту с определенными правами, в определенном контексте безопасности.
141
142 =over
143
144 =item C<$object>
145
146 Объект доступа.
147
148 =item C<$desiredAccess>
149
150 Требуемые права доступа.
151
152 =item C<$context>
153
154 Контекст безопасности, если не указан, то используется текущий C<< IMPL::Security::Context->contextCurrent >>
155
156 =item C<returns>
157
158 C<true | false> - результат проверки
159
160 =back
161
162 =item C<MakeContext($principal,$role,$auth)>
163
164 Создает контекст безопасности, инициализируя его передданными параметрами.
165
166 =over
167
168 =item C<$principal>
169
170 Объект пользователя
171
172 =item C<$role>
173
174 Роль или ссылка на массив ролей
175
176 =item C<$auth>
177
178 Объект аутентификации
179
180 =back
181
182 =item C<Take($principal,$role)>
183
184 Метод. Делегирует текущему пользователю полномочия другого пользователя. При этом выполняется проверка
185 правомерности такой операции. В случае неудачи вызывается исключение.
186
187 =over
188
189 =item C<$principal>
190
191 Либо имя пользователя либо объект C<IMPL::Security::Principal>.
192
193 =item C<$role>
194
195 Либо имя либо ссылка на роль, или ссылка на массив либо имен, либо ролей.
196
197 =item C<returns>
198
199 Новый контекст безопасности.
200
201 =back
202
203 =item C<Rules()>
204
205 Возвращает список правил которые выполняются при проверках доступа. Пререопределите этот
206 метод, чтобы возвращать собственный список правил. Список правил является ссылкой на массив
207 элементами которого являются функции.
208
209 =begin code
210
211 package MySecurity;
212
213 use parent qw(IMPL::Security);
214
215 sub Rules {
216 return [
217 \&Rule1,
218 \&Rule2,
219 #...
220 ]
221 }
222
223 =end code
224
225 =item C<[static,get] authority>
226
227 Метод, позволяющий получить текущий источник системы безопасности. Источник безопасности, это модуль,
228 который получает входные данные и использует их для работы системы безопасности.
229
230 =back
231
232 =cut