comparison lib/IMPL/Security/AbstractContext.pm @ 407:c6e90e02dd17 ref20150831

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