Mercurial > pub > Impl
view Lib/IMPL/Security/AbstractContext.pm @ 245:7c517134c42f
Added Unsupported media type Web exception
corrected resourceLocation setting in the resource
Implemented localizable resources for text messages
fixed TT view scopings, INIT block in controls now sets globals correctly.
author | sergey |
---|---|
date | Mon, 29 Oct 2012 03:15:22 +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