Mercurial > pub > Impl
diff Lib/IMPL/Security/Auth/Simple.pm @ 230:6d8092d8ce1b
*reworked IMPL::Security
*reworked IMPL::Web::Security
*refactoring
author | sergey |
---|---|
date | Mon, 08 Oct 2012 03:37:37 +0400 |
parents | 4d0e1962161c |
children | 23daf2fae33a |
line wrap: on
line diff
--- a/Lib/IMPL/Security/Auth/Simple.pm Sat Sep 29 02:34:47 2012 +0400 +++ b/Lib/IMPL/Security/Auth/Simple.pm Mon Oct 08 03:37:37 2012 +0400 @@ -1,61 +1,69 @@ package IMPL::Security::Auth::Simple; use strict; -use parent qw(IMPL::Object IMPL::Security::Auth); -use Digest::MD5; +use Digest::MD5 qw(md5_hex); -use IMPL::Class::Property; use IMPL::Security::Auth qw(:Const); -BEGIN { - private property _passwordImage => prop_all; - private property _sessionCookie => prop_all; -} +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 ($passImg,$cookie) = split /\|/,$secData; + my ($stage,$salt,$img) = split /\|/,$secData; + + die WrongDataException->new() unless grep $_ == $stage, (STAGE_INIT, STAGE_DONE); - $this->_passwordImage($passImg); - $this->_sessionCookie($cookie); + $this->_stage($stage); + $this->_salt($salt); + $this->_image($img); + } sub secData { my ($this) = @_; - if ($this->_sessionCookie) { - return join ('|',$this->_passwordImage, $this->_sessionCookie ); - } else { - return $this->_passwordImage; - } + return join ('|',$this->_stage, $this->_salt , $this->_image ); } sub isTrusted { my ($this) = @_; - $this->_sessionCookie ? 1 : 0; + $this->_stage == STAGE_DONE ? 1 : 0; } sub DoAuth { my ($this,$challenge) = @_; - - if (Digest::MD5::md5_hex($challenge) eq $this->_passwordImage) { - return (AUTH_SUCCESS,$this->_sessionCookie($this->GenSSID)); - } elsee { - return (AUTH_FAIL,$this->_sessionCookie(undef)); - } -} + + my $salt = $this->_salt; -sub ValidateSession { - my ($this,$cookie) = @_; - - die new IMPL::InvalidOperationException("The context is untrusted") unless $this->_sessionCookie; - - if ($cookie eq $this->_sessionCookie) { - return (AUTH_SUCCESS,undef); - } else { - return (AUTH_FAIL,undef); + if (md5_hex($salt, $challenge, $salt) eq $this->_image) { + if ($this->_stage == STAGE_INIT) { + $this->_stage(STAGE_DONE); + } + return (AUTH_SUCCESS, undef); + } elsee { + return (AUTH_FAIL, undef); } } @@ -64,11 +72,12 @@ die new IMPL::InvalidArgumentException("The parameter is required",'password') unless $args{password}; - return Digest::MD5::md5_hex($args{password}); + my $salt = $self->GenSSID(); + return return join ('|',STAGE_INIT, $salt, md5_hex($salt,$args{password},$salt)); } sub SecDataArgs { - password => 'SCALAR' + password => 'SCALAR' } 1; @@ -87,26 +96,24 @@ =head1 MEMBERS -=over - -=item C<CTOR($secData)> +=head2 C<CTOR($secData)> Создает объект аутентификации, передавая ему данные для инициализации. -=item C<[get]secData> +=head2 C<[get]secData> Возвращает данные безопасности, которые можно использовать для восстановления состояния объекта. -=item C<[get]isTrusted> +=head2 C<[get]isTrusted> Является ли объект доверенным для аутентификации сессии (тоесть хранит данные для аутентификации сессии). -=item C<DoAuth($challenge)> +=head2 C<DoAuth($challenge)> Аутентифицирует пользователя. Используется один этап. C<$challenge> -открытый пароль пользователя. +открытый пароль пользователя или cookie сессии. Возвращает C<($status,$challenge)> @@ -118,28 +125,7 @@ =item C<$challenge> -В случае успеха возвращает cookie (уникальный номер) сессии - -=back - -=item C<ValidateSession($challenge)> - -Проверяет аутентичность сессии. Использует один этап. C<$challenge> cookie -сессии, полученный при выполнении метода C<DoAuth>. - -Возвращает C<($status,$challenge)> - -=over - -=item C<$status> - -Результат либо C<AUTH_SUCCESS>, либо C<AUTH_FAIL> - -=item C<$challenge> - -Всегда C<undef> - -=back +В случае успеха возвращает cookie (уникальный номер) сессии, либо C<undef> =back