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