Mercurial > pub > Impl
annotate Lib/IMPL/Security/Context.pm @ 116:1722ca51537c
minor changes.
Auth no more throws an exception when fails
| author | wizard | 
|---|---|
| date | Mon, 31 May 2010 08:30:39 +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: 
94diff
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 | 
