Mercurial > pub > Impl
view Lib/IMPL/Security/Context.pm @ 85:190c794a41ae
DateTime renamed because of collision
author | wizard |
---|---|
date | Fri, 16 Apr 2010 16:33:11 +0400 |
parents | 077357224bec |
children | 79bf75223afe |
line wrap: on
line source
package IMPL::Security::Context; use strict; use warnings; use base qw(IMPL::Object IMPL::Object::Autofill); __PACKAGE__->PassThroughArgs; use IMPL::Class::Property; require IMPL::Security::Principal; my $current; my $nobody; BEGIN { public property principal => prop_get; public property rolesAssigned => prop_all | prop_list; public property auth => prop_all; } sub CTOR { my ($this) = @_; die new IMPL::InvalidArgumentException("The parameter is required", 'principal') unless $this->principal; } sub Impersonate { my ($this,$code) = @_; my $old = $current; my $result; local $@; eval { $result = $code->(); }; $current = $old; if($@) { die $@; } else { return $result; } } sub isTrusted { my ($this) = @_; if (my $auth = $this->auth) { return $auth->isTrusted; } else { return 0; } } sub nobody { my ($self) = @_; $nobody = $self->new(principal => IMPL::Security::Principal->nobody, rolesAssigned => undef) unless $nobody; $nobody; } sub current { my ($self) = @_; $current = __PACKAGE__->nobody unless $current; $current; } 1; __END__ =pod =head1 NAME C<IMPL::Security::Context> - контекст безопасности. =head1 SINOPSYS =begin code my $context = IMPL::Security::Context->nobody; my $result = $context->Impersonate( sub { # do some untrusted code } ); =end code =head1 DESCRIPTION C<[Autofill]> Являет собой контекст безопасности, описывает пользователя и привелегии, так же у потока есть текущий контекст безопасности, по умолчанию он C<nobody>. =head1 MEMBERS =over =item C<CTOR(%props)> Создает объект и заполняет его свойствами. =item C<[get] principal> Идентификатор пользователя, владельца контекста. =item C<[get] rolesAssigned> Список назначенных (активных) ролей пользователю. =item C<[get] auth> Объект асторизации C<IMPL::Security::Auth>, использованный при создании текущего контекста. =item C<[get] isTrusted> Возвращает значение является ли контекст доверенным, тоесть сессия аутетифицирована. =item C<Impersonate($code)> Делает контекст текущим и выполняет в нем функцию по ссылке C<$code>. По окончании выполнения, контекст восстанавливается. =item C<[static,get] nobody> Контекст для неаутентифицированных пользователей, минимум прав. =item C<[static,get] current> Текущий контекст. =back =cut