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