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