view Lib/IMPL/Security/Auth/Simple.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 23daf2fae33a
children 0057f48f7945
line wrap: on
line source

package IMPL::Security::Auth::Simple;
use strict;

use Digest::MD5 qw(md5_hex);

use IMPL::Security::Auth qw(:Const);

use IMPL::Const qw(:prop);
use IMPL::declare {
    require => {
        Exception => 'IMPL::Exception',
        WrongDataException => '-IMPL::WrongDataException'        
    },
    base => [
        'IMPL::Security::Auth' => undef,
        'IMPL::Object' => undef
    ],
    props => [
        _stage => PROP_ALL,
        _salt => PROP_ALL,
        _image => PROP_ALL
    ]
};

use constant {
    STAGE_INIT => 1,
    STAGE_DONE => 2    
};

sub CTOR {
    my ($this,$secData) = @_;
    
    my ($stage,$salt,$img) = split /\|/,$secData;
    
    die WrongDataException->new()  unless grep $_ == $stage, (STAGE_INIT, STAGE_DONE);
    
    $this->_stage($stage);
    $this->_salt($salt);
    $this->_image($img);
    
}

sub secData {
    my ($this) = @_;
    
    return join ('|',$this->_stage, $this->_salt , $this->_image );
}

sub isTrusted {
    my ($this) = @_;
    
    $this->_stage == STAGE_DONE ? 1 : 0;
}

sub DoAuth {
    my ($this,$challenge) = @_;
    
    my $salt = $this->_salt;

    if (md5_hex($salt, $challenge, $salt) eq $this->_image) {
        if ($this->_stage == STAGE_INIT) {
            $this->_stage(STAGE_DONE);
        }
        return (AUTH_SUCCESS, undef);
    } else {
        return (AUTH_FAIL, undef);
    }
}

sub CreateSecData {
    my ($self,%args) = @_;
    
    die new IMPL::InvalidArgumentException("The parameter is required",'password') unless $args{password};
    
    my $salt = $self->GenSSID();
    return return join ('|',STAGE_INIT, $salt, md5_hex($salt,$args{password},$salt));
}

sub SecDataArgs {
    password => 'SCALAR'
}

1;

__END__

=pod

=head1 NAME

C<IMPL::Security::Auth::Simple> Модуль простой авторизации.

=head1 DESCRIPTION

Использует алгоритм MD5 для хранения образа пароля.

=head1 MEMBERS

=head2 C<CTOR($secData)>

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

=head2 C<[get]secData>

Возвращает данные безопасности, которые можно использовать для восстановления
состояния объекта.

=head2 C<[get]isTrusted>

Является ли объект доверенным для аутентификации сессии (тоесть хранит данные
для аутентификации сессии).

=head2 C<DoAuth($challenge)>

Аутентифицирует пользователя. Используется один этап. C<$challenge>
открытый пароль пользователя или cookie сессии.

Возвращает C<($status,$challenge)>

=over

=item C<$status>

Результат либо C<AUTH_SUCCESS>, либо C<AUTH_FAIL>

=item C<$challenge>

В случае успеха возвращает cookie (уникальный номер) сессии, либо C<undef>

=back

=cut