Mercurial > pub > Impl
view Lib/IMPL/Security/AbstractContext.pm @ 250:129e48bb5afb
DOM refactoring
ObjectToDOM methods are virtual
QueryToDOM uses inflators
Fixed transform for the complex values in the ObjectToDOM
QueryToDOM doesn't allow to use complex values (HASHes) as values for nodes (overpost problem)
author | sergey |
---|---|
date | Wed, 07 Nov 2012 04:17:53 +0400 |
parents | b8c724f6de36 |
children | 2879cdb6b8cd |
line wrap: on
line source
package IMPL::Security::AbstractContext; use strict; use warnings; use IMPL::Const qw(:prop); use IMPL::require { Role => 'IMPL::Security::Role' }; use parent qw(IMPL::Class::Meta); __PACKAGE__->static_accessor_clone(abstractProps => [ principal => PROP_RW, rolesAssigned => PROP_RW | PROP_LIST, auth => PROP_RW, authority => PROP_RW ]); my $current; # current session if any sub Impersonate { my ($this,$code,@args) = @_; my $old = $current; $current = $this; my $result; my $e; { local $@; eval { $result = $code->(@args); }; $e = $@; } $current = $old; if($e) { die $e; } else { return $result; } } sub Apply { my ($this) = @_; $current = $this; } sub isTrusted { my ($this) = @_; if (my $auth = $this->auth) { return $auth->isTrusted; } else { return 0; } } sub Satisfy { my ($this,@roles) = @_; my $roleEffective = Role->new ( _effective => scalar $this->rolesAssigned ); return $roleEffective->Satisfy(@roles); } sub current { $current; } 1; __END__ =pod =head1 NAME C<abstract IMPL::Security::Context> - контекст безопасности. =head1 SINOPSYS =begin code package MyApp::Model::Session; use strict; use IMPL::delare { base => [ 'MyApp::Model::BaseDBO' => '@_', 'IMPL::Security::AbstractContext' => undef ], props { IMPL::Security::AbstractContext->abstractProps, qouta => PROP_GET } } package main; $app->model->GetSession('546a54df4')->Impersonate(sub{ # do something }); =end code =head1 DESCRIPTION Код приложения, которое выполняется Являет собой контекст безопасности, описывает пользователя и привелегии, так же у программы есть текущий контекст безопасности, по умолчанию он C<nobody>. =head1 MEMBERS =head2 C<[get] principal> Идентификатор пользователя, владельца контекста. =head2 C<[get] rolesAssigned> Список назначенных (активных) ролей пользователю. =head2 C<[get] auth> Объект асторизации C<IMPL::Security::Auth>, использованный при создании текущего контекста. =head2 C<[get] authority> Модуль безопасности, породивший данный контекст. Модуль безопасности, отвечающий за создание контекста безопасности должен реализовывать метод C<CreateContext($user,$auth,$roles)> =head2 C<[get] isTrusted> Возвращает значение является ли контекст доверенным, тоесть клиент аутентифицирован и сессия установлена. Если C<false> значит, что сессия была начата, однако не установлена до конца. =head2 C<Impersonate($code)> Делает контекст текущим и выполняет в нем функцию по ссылке C<$code>. По окончании выполнения, контекст восстанавливается в предыдущий (не зависимо от того, что с ним происходило во время выполнения C<$code>). =head2 C<Apply()> Заменяет текущий контекст на себя, но до конца действия метода C<Impersonate>, если таковой был вызван. =cut