Mercurial > pub > Impl
annotate Lib/IMPL/Security/Context.pm @ 115:5edc2ac5231c
minor fix to the serialization mechanism
author | wizard |
---|---|
date | Wed, 26 May 2010 02:32:22 +0400 |
parents | 964587c5183c |
children | 92c850d0bdb9 |
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 | |
81 | 52 sub isTrusted { |
53 my ($this) = @_; | |
54 | |
55 if (my $auth = $this->auth) { | |
56 return $auth->isTrusted; | |
57 } else { | |
58 return 0; | |
59 } | |
60 } | |
61 | |
74 | 62 sub nobody { |
49 | 63 my ($self) = @_; |
68 | 64 $nobody = $self->new(principal => IMPL::Security::Principal->nobody, rolesAssigned => undef) unless $nobody; |
49 | 65 $nobody; |
66 } | |
67 | |
74 | 68 sub current { |
51 | 69 my ($self) = @_; |
70 | |
71 $current = __PACKAGE__->nobody unless $current; | |
72 $current; | |
73 } | |
74 | |
94 | 75 sub Satisfy { |
76 my ($this,@roles) = @_; | |
77 | |
78 my $roleEffective = new IMPL::Security::Role ( _effective => $this->rolesAssigned ); | |
79 | |
80 return $roleEffective->Satisfy(@roles); | |
81 } | |
82 | |
49 | 83 1; |
74 | 84 |
85 __END__ | |
86 | |
87 =pod | |
88 | |
89 =head1 NAME | |
90 | |
91 C<IMPL::Security::Context> - контекст безопасности. | |
92 | |
93 =head1 SINOPSYS | |
94 | |
95 =begin code | |
96 | |
97 my $context = IMPL::Security::Context->nobody; | |
98 | |
99 my $result = $context->Impersonate( | |
100 sub { | |
101 # do some untrusted code | |
102 } | |
103 ); | |
104 | |
105 =end code | |
106 | |
107 =head1 DESCRIPTION | |
108 | |
109 C<[Autofill]> | |
110 | |
111 Являет собой контекст безопасности, описывает пользователя и привелегии, так же | |
96 | 112 у программы есть текущий контекст безопасности, по умолчанию он C<nobody>. |
74 | 113 |
114 =head1 MEMBERS | |
115 | |
116 =over | |
117 | |
118 =item C<CTOR(%props)> | |
119 | |
120 Создает объект и заполняет его свойствами. | |
121 | |
122 =item C<[get] principal> | |
123 | |
124 Идентификатор пользователя, владельца контекста. | |
125 | |
126 =item C<[get] rolesAssigned> | |
127 | |
128 Список назначенных (активных) ролей пользователю. | |
129 | |
130 =item C<[get] auth> | |
131 | |
132 Объект асторизации C<IMPL::Security::Auth>, использованный при создании текущего контекста. | |
133 | |
96 | 134 =item C<[static,get] authority> |
135 | |
136 Источник данных безопасности, породивший данный контекст. | |
137 | |
81 | 138 =item C<[get] isTrusted> |
139 | |
140 Возвращает значение является ли контекст доверенным, тоесть сессия аутетифицирована. | |
141 | |
74 | 142 =item C<Impersonate($code)> |
143 | |
144 Делает контекст текущим и выполняет в нем функцию по ссылке C<$code>. По окончании | |
145 выполнения, контекст восстанавливается. | |
146 | |
147 =item C<[static,get] nobody> | |
148 | |
149 Контекст для неаутентифицированных пользователей, минимум прав. | |
150 | |
151 =item C<[static,get] current> | |
152 | |
153 Текущий контекст. | |
154 | |
155 =back | |
156 | |
157 =cut |