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