Mercurial > pub > Impl
annotate Lib/IMPL/Security/Context.pm @ 193:8e8401c0aea4
sync
author | sergey |
---|---|
date | Tue, 10 Apr 2012 08:13:22 +0400 |
parents | d1676be8afcc |
children | 4d0e1962161c |
rev | line source |
---|---|
49 | 1 package IMPL::Security::Context; |
2 use strict; | |
3 use warnings; | |
4 | |
166 | 5 use parent qw(IMPL::Object IMPL::Object::Autofill); |
74 | 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) = @_; |
173 | 70 $nobody = $self->new(principal => IMPL::Security::Principal->nobody) 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 | |
158 | 84 my $roleEffective = new IMPL::Security::Role ( _effective => scalar $this->rolesAssigned ); |
94 | 85 |
86 return $roleEffective->Satisfy(@roles); | |
87 } | |
88 | |
49 | 89 1; |
74 | 90 |
91 __END__ | |
92 | |
93 =pod | |
94 | |
95 =head1 NAME | |
96 | |
180 | 97 C<IMPL::Security::Context> - контекст безопасности. |
74 | 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 | |
180 | 117 Являет собой контекст безопасности, описывает пользователя и привелегии, так же |
118 у программы есть текущий контекст безопасности, по умолчанию он C<nobody>. | |
74 | 119 |
120 =head1 MEMBERS | |
121 | |
122 =over | |
123 | |
124 =item C<CTOR(%props)> | |
125 | |
180 | 126 Создает объект и заполняет его свойствами. |
74 | 127 |
128 =item C<[get] principal> | |
129 | |
180 | 130 Идентификатор пользователя, владельца контекста. |
74 | 131 |
132 =item C<[get] rolesAssigned> | |
133 | |
180 | 134 Список назначенных (активных) ролей пользователю. |
74 | 135 |
136 =item C<[get] auth> | |
137 | |
180 | 138 Объект асторизации C<IMPL::Security::Auth>, использованный при создании текущего контекста. |
74 | 139 |
96 | 140 =item C<[static,get] authority> |
141 | |
180 | 142 Источник данных безопасности, породивший данный контекст. |
96 | 143 |
81 | 144 =item C<[get] isTrusted> |
145 | |
180 | 146 Возвращает значение является ли контекст доверенным, тоесть сессия аутетифицирована. |
81 | 147 |
74 | 148 =item C<Impersonate($code)> |
149 | |
180 | 150 Делает контекст текущим и выполняет в нем функцию по ссылке C<$code>. По окончании |
151 выполнения, контекст восстанавливается. | |
74 | 152 |
121 | 153 =item C<Apply()> |
154 | |
180 | 155 Заменяет текущий контекст на себя, но до конца действия метода C<Impersonate>, если |
156 таковой был вызван. | |
121 | 157 |
74 | 158 =item C<[static,get] nobody> |
159 | |
180 | 160 Контекст для неаутентифицированных пользователей, минимум прав. |
74 | 161 |
162 =item C<[static,get] current> | |
163 | |
180 | 164 Текущий контекст. |
74 | 165 |
166 =back | |
167 | |
180 | 168 =cut |