view Lib/IMPL/Web/Security.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 23daf2fae33a
children 63709a4e6da0
line wrap: on
line source

package IMPL::Web::Security;
use strict;

use IMPL::Security::Auth qw(:Const);
use IMPL::declare {
    require => {
        Exception => 'IMPL::Exception',
        NotImplementedException => '-IMPL::NotImplementedException',
        SecurityContext => 'IMPL::Security::AbstractContext'
    },
};

use constant {
    ERR_NO_SUCH_USER => -1,
    ERR_NO_SEC_DATA => -2,
    ERR_NO_AUTHORITY => -3,
    ERR_NO_SEC_CONTEXT => -4,
    ERR_AUTH_FAIL => -5
};

sub AuthUser {
    my ($this,$name,$package,$challenge) = @_;
    
    my $user = $this->FindUserByName($name)
        or return {
            status => AUTH_FAIL,
            code => ERR_NO_SUCH_USER
        };

    my $auth;
    if ( my $secData = $user->GetSecData($package) ) {
        $auth = $package->new($secData);
    } else {
        return {
            status => AUTH_FAIL,
            code => ERR_NO_SEC_DATA,
            user => $user
        };
    }
    
    return {
    	status => AUTH_FAIL,
    	code => ERR_NO_SEC_CONTEXT
    } unless SecurityContext->current;
    
    return {
    	status => AUTH_FAIL,
    	code => ERR_NO_AUTHORITY
    } unless SecurityContext->current->authority;

    my $status = SecurityContext->current->authority->InitSession(
        $user,
        [$user->roles],
        $auth,
        $challenge
    );
    
    return {
        status => $status,
        code => ($status == AUTH_FAIL ? ERR_AUTH_FAIL : 0),
        user => $user
    };
}

sub Logout {
	my ($this) = @_;
	
	my $session = SecurityContext->current;
	if($session && $session->authority) {
		$session->authority->CloseSession($session);
		
		$this->CloseSession($session);
	}
}

sub FindUserByName {
    die NotImplementedException->new();
}

sub CreateSession {
    die NotImplementedException->new();
}

sub GetSession {
    die NotImplementedException->new();
}

sub SaveSession {
    die NotImplementedException->new();
}

sub CloseSession {
	die NotImplementedException->new();
}

1;

__END__

=pod

=head1 NAME

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

=head1 DESCRIPTION

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

Сама система безопасности в веб приложении состоит из двух частей

=over

=item Модель системы безопасности

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

=item Модуль безопасности

Как правило встраивается в транспортный уровеь в виде обработчика
C<IMPL::Web::Handler> и реализует непосредственно протокол аутентификации и
обмена с пользователем.

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

=back

=head1 MEMBERS

=head2 C<AuthUser($name,$package,$challenge)>

Инициирует создание новой сессии используя провайдера безопасности текущего
контекста безопасности.

=over

=item C<$name>

Имя пользователя, которое будет использоваться при поиске его в БД. 

=item C<$package>

Имя модуля аутентификации, например, C<IMPL::Security::Auth::Simple>.

=item C<$challenge>

Данные, полученные от клиента, которые будут переданы модулю аутентификации для
начала процесса аутентификации и создания сессии.

=back

Функция возвращает хеш с элементами

=over

=item C<status>

Статус аутентификации - отражает общее состояние процесса ацтентификации,

=over

=item C<AUTH_FAIL>

Аутентификация неудачная, сессия не создана.

=item C<AUTH_INCOMPLETE>

Аутентификация требует дополнительных шагов, сессия создана, но еще не доверена.

=item C<AUTH_SUCCESS>

Аутентификация успешно проведена, сессия создана.

=back

=item C<code>

=back

=cut