diff lib/IMPL/Security/Auth/Simple.pm @ 407:c6e90e02dd17 ref20150831

renamed Lib->lib
author cin
date Fri, 04 Sep 2015 19:40:23 +0300
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/IMPL/Security/Auth/Simple.pm	Fri Sep 04 19:40:23 2015 +0300
@@ -0,0 +1,133 @@
+package IMPL::Security::Auth::Simple;
+use strict;
+
+use Digest::MD5 qw(md5_hex);
+use Encode qw(encode);
+
+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,encode('utf-8', $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,encode('utf-8', $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