comparison Lib/IMPL/Security/Context.pm @ 230:6d8092d8ce1b

*reworked IMPL::Security *reworked IMPL::Web::Security *refactoring
author sergey
date Mon, 08 Oct 2012 03:37:37 +0400
parents 4d0e1962161c
children b8c724f6de36
comparison
equal deleted inserted replaced
229:47f77e6409f7 230:6d8092d8ce1b
1 package IMPL::Security::Context; 1 package IMPL::Security::Context;
2 use strict; 2 use strict;
3 use warnings; 3 use warnings;
4 4
5 use parent qw(IMPL::Object IMPL::Object::Autofill); 5 use IMPL::require {
6 Principal => 'IMPL::Security::Principal',
7 Role => 'IMPL::Security::Role',
8 AbstractContext => 'IMPL::Security::AbstractContext',
9 Exception => 'IMPL::Exception',
10 ArgumentException => '-IMPL::InvalidArgumentException'
11
12 };
6 13
7 __PACKAGE__->PassThroughArgs; 14 use IMPL::declare {
15 base => [
16 'IMPL::Object' => undef,
17 'IMPL::Object::Autofill' => undef,
18 'IMPL::Security::AbstractContext' => undef,
19 ],
20 props => [
21 @{AbstractContext->abstractProps()}
22 ]
23 };
8 24
9 use IMPL::Class::Property; 25 __PACKAGE__->abstractProps([]);
10 26
11 require IMPL::Security::Principal;
12 27
13 my $current;
14 my $nobody; 28 my $nobody;
15
16 BEGIN {
17 public property principal => prop_get;
18 public property rolesAssigned => prop_all | prop_list;
19 public property auth => prop_all;
20 public property authority => prop_all;
21 }
22 29
23 sub CTOR { 30 sub CTOR {
24 my ($this) = @_; 31 my ($this) = @_;
25 32
26 die new IMPL::InvalidArgumentException("The parameter is required", 'principal') unless $this->principal; 33 die ArgumentException->new("The parameter is required", 'principal') unless $this->principal;
27 }
28
29 sub Impersonate {
30 my ($this,$code) = @_;
31
32 my $old = $current;
33 $current = $this;
34 my $result;
35 my $e;
36
37 {
38 local $@;
39 eval {
40 $result = $code->();
41 };
42 $e = $@;
43 }
44 $current = $old;
45 if($e) {
46 die $e;
47 } else {
48 return $result;
49 }
50 }
51
52 sub Apply {
53 my ($this) = @_;
54
55 $current = $this;
56 }
57
58 sub isTrusted {
59 my ($this) = @_;
60
61 if (my $auth = $this->auth) {
62 return $auth->isTrusted;
63 } else {
64 return 0;
65 }
66 } 34 }
67 35
68 sub nobody { 36 sub nobody {
69 my ($self) = @_; 37 my ($self) = @_;
70 $nobody = $self->new(principal => IMPL::Security::Principal->nobody) unless $nobody; 38 $nobody = $self->new(principal => Principal->nobody) unless $nobody;
71 $nobody; 39 $nobody;
72 } 40 }
73 41
74 sub current { 42 sub isTrusted {
75 my ($self) = @_; 43 return 1;
76
77 $current = __PACKAGE__->nobody unless $current;
78 $current;
79 }
80
81 sub Satisfy {
82 my ($this,@roles) = @_;
83
84 my $roleEffective = new IMPL::Security::Role ( _effective => scalar $this->rolesAssigned );
85
86 return $roleEffective->Satisfy(@roles);
87 } 44 }
88 45
89 1; 46 1;
90 47
91 __END__ 48 __END__
92 49
93 =pod 50 =pod
94 51
95 =head1 NAME 52 =head1 NAME
96 53
97 C<IMPL::Security::Context> - контекст безопасности. 54 C<IMPL::Security::Context> - реализация контекста безопасности создаваемого в
55 приложении.
98 56
99 =head1 SINOPSYS 57 =head1 SYNOPSIS
100 58
101 =begin code 59 =begin code
102 60
103 my $context = IMPL::Security::Context->nobody; 61 my $context = IMPL::Security::Context->nobody;
104 62
106 sub { 64 sub {
107 # do some untrusted code 65 # do some untrusted code
108 } 66 }
109 ); 67 );
110 68
69 $context = IMPL::Security::Context->new(
70 principal => $user,
71 assignedRoles => [
72 $backupRole,
73 $controlRole
74 ]
75 );
76
77 $context->Impersonate(
78 sub {
79
80 # do some authorized operations
81
82 $service->backupData('current.bak');
83 $service->stop();
84 }
85 );
86
111 =end code 87 =end code
112 88
113 =head1 DESCRIPTION 89 =head1 DESCRIPTION
114 90
115 C<[Autofill]> 91 C<autofill>
116 92
117 Являет собой контекст безопасности, описывает пользователя и привелегии, так же 93 Данная реализация контекста безопасности не привязана ни к источнику данных
118 у программы есть текущий контекст безопасности, по умолчанию он C<nobody>. 94 ни к пакету аутентификации и авторизации, ее приложение может создать в любой
95 момент, при этом система сама несет ответственность за последствия.
96
97 Данный контекст нужен для выполнения системой служебных функций.
119 98
120 =head1 MEMBERS 99 =head1 MEMBERS
121 100
122 =over 101 см. также C<IMPL::Security::AbstractContext>.
123 102
124 =item C<CTOR(%props)> 103 =head2 C<CTOR(%props)>
125 104
126 Создает объект и заполняет его свойствами. 105 Создает объект и заполняет его свойствами. C<principal> должен быть обязательно
106 указан.
127 107
128 =item C<[get] principal> 108 =head2 C<[static,get] nobody>
129
130 Идентификатор пользователя, владельца контекста.
131
132 =item C<[get] rolesAssigned>
133
134 Список назначенных (активных) ролей пользователю.
135
136 =item C<[get] auth>
137
138 Объект асторизации C<IMPL::Security::Auth>, использованный при создании текущего контекста.
139
140 =item C<[static,get] authority>
141
142 Источник данных безопасности, породивший данный контекст.
143
144 =item C<[get] isTrusted>
145
146 Возвращает значение является ли контекст доверенным, тоесть сессия аутетифицирована.
147
148 =item C<Impersonate($code)>
149
150 Делает контекст текущим и выполняет в нем функцию по ссылке C<$code>. По окончании
151 выполнения, контекст восстанавливается.
152
153 =item C<Apply()>
154
155 Заменяет текущий контекст на себя, но до конца действия метода C<Impersonate>, если
156 таковой был вызван.
157
158 =item C<[static,get] nobody>
159 109
160 Контекст для неаутентифицированных пользователей, минимум прав. 110 Контекст для неаутентифицированных пользователей, минимум прав.
161 111
162 =item C<[static,get] current>
163
164 Текущий контекст.
165
166 =back
167
168 =cut 112 =cut