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
|
51
|
25 sub Rules {
|
|
26 return \@rules;
|
|
27 }
|
49
|
28
|
|
29 1;
|
50
|
30
|
|
31 __END__
|
|
32
|
|
33 =pod
|
|
34
|
66
|
35 =head1 NAME
|
|
36
|
|
37 C<IMPL::Security> - Модуль для работы с функциями авторизации и аутентификации.
|
|
38
|
|
39 =head1 SINOPSYS
|
|
40
|
|
41 =begin code
|
|
42
|
|
43 use IMPL::Security;
|
|
44
|
|
45 my Method {
|
|
46 my $this = shift;
|
|
47
|
|
48 # access check in the current context, using standard configuration
|
|
49 IMPL::Security->AccessCheck($this,'Method') or die new IMPL::AccessDeniedException("Access is denied");
|
|
50
|
|
51 #some more results
|
|
52 }
|
|
53
|
|
54 my DelegationMethod {
|
|
55
|
|
56 my $this = shift;
|
|
57
|
|
58 #forced delegation
|
|
59 my $delegatedContext = IMPL::Security::Context->new(
|
|
60 Principal => IMPL::Security::Principal->new(
|
|
61 Name => 'suser'
|
|
62 ),
|
|
63 AssignedRoles => ['administrator']
|
|
64 )
|
|
65
|
|
66 my $result;
|
|
67
|
|
68 $delegatedContext->Impersonate(sub{
|
|
69 $result = $this->Method();
|
|
70 });
|
|
71
|
|
72 return $result;
|
|
73 }
|
|
74
|
|
75 my SafeDelegationMethod {
|
|
76
|
|
77 my $this = shift;
|
|
78
|
|
79 my $delegatedContext = IMPL::Security->Take( suser => 'administrator' );
|
|
80
|
|
81 my $result;
|
|
82
|
|
83 $delegatedContext->Impersonate(sub{
|
|
84 $result = $this->Method();
|
|
85 });
|
|
86
|
|
87 return $result;
|
|
88 }
|
|
89
|
|
90 =end code
|
|
91
|
50
|
92 =head1 DESCRIPTION
|
|
93
|
51
|
94 Модуль для инфраструктуры безопасности, реализует основные функции для авторизации
|
|
95 и аутентификации пользователей.
|
|
96
|
|
97 Модуль аутентификации, реализиция которого зависит от приложения, аутентифицирует
|
|
98 пользователя, при этом создается контекст безопасности, который содержит
|
|
99 идентификатор пользователя и список активных ролей.
|
|
100
|
|
101 При проверке прав доступа происходит последовательная проверка правил доступа,
|
|
102 если все правила выполнены, то доступ разрешается.
|
|
103
|
66
|
104 =head1 MEMBERS
|
50
|
105
|
66
|
106 =over
|
|
107
|
|
108 =item C<AccessCheck($object,$desiredAccess,$context)>
|
|
109
|
|
110 Метод. Проверка доступа к объекту с определенными правами, в определенном контексте безопасности.
|
|
111
|
|
112 =over
|
|
113
|
|
114 =item C<$object>
|
|
115
|
|
116 Объект доступа.
|
|
117
|
|
118 =item C<$desiredAccess>
|
|
119
|
|
120 Требуемые права доступа.
|
|
121
|
|
122 =item C<$context>
|
|
123
|
|
124 Контекст безопасности, если не указан, то используется текущий C<< IMPL::Security::Context->contextCurrent >>
|
|
125
|
|
126 =item C<returns>
|
|
127
|
|
128 C<true | false> - результат проверки
|
|
129
|
|
130 =back
|
|
131
|
|
132 =item C<Take($principal,$role)>
|
|
133
|
|
134 Метод. Делегирует текущему пользователю полномочия другого пользователя. При этом выполняется проверка
|
|
135 правомерности такой операции. В случае неудачи вызывается исключение.
|
|
136
|
|
137 =over
|
|
138
|
|
139 =item C<$principal>
|
|
140
|
|
141 Либо имя пользователя либо объект C<IMPL::Security::Principal>.
|
|
142
|
|
143 =item C<$role>
|
|
144
|
|
145 Либо имя либо ссылка на роль, или ссылка на массив либо имен, либо ролей.
|
|
146
|
|
147 =item C<returns>
|
|
148
|
|
149 Новый контекст безопасности.
|
|
150
|
|
151 =back
|
|
152
|
|
153 =item C<Roles()>
|
|
154
|
|
155 Возвращает список правил которые выполняются при проверках доступа. Пререопределите этот
|
|
156 метод, чтобы возвращать собственный список правил. Список правил является ссылкой на массив
|
|
157 элементами которого являются функции.
|
|
158
|
|
159 =begin code
|
|
160
|
|
161 package MySecurity;
|
|
162
|
|
163 use base qw(IMPL::Security);
|
|
164
|
|
165 sub Rules {
|
|
166 return [
|
|
167 \&Rule1,
|
|
168 \&Rule2,
|
|
169 #...
|
|
170 ]
|
|
171 }
|
|
172
|
|
173 =end code
|
|
174
|
|
175 =back
|
50
|
176
|
|
177 =cut |