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