view Lib/IMPL/Web/Security.pm @ 253:0a228a35645c

added application exception class
author sergey
date Mon, 19 Nov 2012 17:54:01 +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