view Lib/IMPL/Security.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 6d8092d8ce1b
children 2270de2469ff
line wrap: on
line source

package IMPL::Security;
use strict;
use Carp qw(carp);

##VERSION##

require IMPL::Exception;
require IMPL::Security::Principal;
require IMPL::Security::AbstractContext;
require IMPL::Security::Rule::RoleCheck;

our @rules = (
    \&IMPL::Security::Rule::RoleCheck::SatisfyAll
);

our $authority = undef;

sub AccessCheck {
    my ($self, $object, $desiredAccess, $context) = @_;
    
    $context ||= IMPL::Security::AbstractContext->context;
    
    $_->() or return 0 foreach @{$self->Rules};
    
    return 1;
}

sub Take {
    my ($self,$principal,$refRoles) = @_;
    
    die new IMPL::NotImplementedException();
}

sub MakeContext {
    my ($this,$principal,$refRoles,$auth) = @_;
    
    return new IMPL::Security::Context(
        principal => $principal,
        rolesAssigned => $refRoles,
        auth => $auth
    );
}

sub Rules {
    return \@rules;
}

sub authority {
    return $authority;
}

sub principal {
    return
        IMPL::Security::AbstractContext->current
        && IMPL::Security::AbstractContext->current->principal
        || IMPL::Security::Principal->nobody; 
}

sub context {
    IMPL::Security::AbstractContext->current;
}

1;

__END__

=pod

=head1 NAME

C<IMPL::Security> - Модуль для работы с функциями авторизации и аутентификации.

=head1 SINOPSYS

=begin code

use IMPL::Security;

my Method {
    my $this = shift;
    
    # access check in the current context, using standard configuration
    IMPL::Security->AccessCheck($this,'Method') or die new IMPL::AccessDeniedException("Access is denied");
    
    #some more results 
}

my DelegationMethod {
    
    my $this = shift;
    
    #forced delegation 
    my $delegatedContext = IMPL::Security::Context->new(
        principal => IMPL::Security::Principal->new(
            name => 'suser'
        ),
        rolesAssigned => ['administrator']
    )
    
    my $result;
    
    $delegatedContext->Impersonate(sub{
        $result = $this->Method();
    });
    
    return $result;
}

my SafeDelegationMethod {
    
    my $this = shift;
    
    my $delegatedContext = IMPL::Security->Take( suser => 'administrator' );
    
    my $result;
    
    $delegatedContext->Impersonate(sub{
        $result = $this->Method();
    });
    
    return $result;
}

=end code

=head1 DESCRIPTION

Модуль для инфраструктуры безопасности, реализует основные функции для авторизации
и аутентификации пользователей.

Модуль аутентификации, реализиция которого зависит от приложения, аутентифицирует
пользователя, при этом создается контекст безопасности, который содержит
идентификатор пользователя и список активных ролей.

При проверке прав доступа происходит последовательная проверка правил доступа,
если все правила выполнены, то доступ разрешается.

=head1 MEMBERS

=over

=item C<AccessCheck($object,$desiredAccess,$context)>

Метод. Проверка доступа к объекту с определенными правами, в определенном контексте безопасности.

=over

=item C<$object>

Объект доступа.

=item C<$desiredAccess>

Требуемые права доступа.

=item C<$context>

Контекст безопасности, если не указан, то используется текущий C<< IMPL::Security::Context->contextCurrent >>

=item C<returns>

C<true | false> - результат проверки

=back

=item C<MakeContext($principal,$role,$auth)>

Создает контекст безопасности, инициализируя его передданными параметрами.

=over

=item C<$principal>

Объект пользователя

=item C<$role>

Роль или ссылка на массив ролей

=item C<$auth>

Объект аутентификации

=back

=item C<Take($principal,$role)>

Метод. Делегирует текущему пользователю полномочия другого пользователя. При этом выполняется проверка
правомерности такой операции. В случае неудачи вызывается исключение.

=over

=item C<$principal>

Либо имя пользователя либо объект C<IMPL::Security::Principal>.

=item C<$role>

Либо имя либо ссылка на роль, или ссылка на массив либо имен, либо ролей.

=item C<returns>

Новый контекст безопасности.

=back

=item C<Rules()>

Возвращает список правил которые выполняются при проверках доступа. Пререопределите этот
метод, чтобы возвращать собственный список правил. Список правил является ссылкой на массив
элементами которого являются функции.

=begin code

package MySecurity;

use parent qw(IMPL::Security);

sub Rules {
    return [
        \&Rule1,
        \&Rule2,
        #...
    ]
}

=end code

=item C<[static,get] authority>

Метод, позволяющий получить текущий источник системы безопасности. Источник безопасности, это модуль,
который получает входные данные и использует их для работы системы безопасности.

=back

=cut