Mercurial > pub > Impl
comparison 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 |
comparison
equal
deleted
inserted
replaced
| 229:47f77e6409f7 | 230:6d8092d8ce1b |
|---|---|
| 1 package IMPL::Security::Auth::Simple; | 1 package IMPL::Security::Auth::Simple; |
| 2 use strict; | 2 use strict; |
| 3 | 3 |
| 4 use parent qw(IMPL::Object IMPL::Security::Auth); | 4 use Digest::MD5 qw(md5_hex); |
| 5 use Digest::MD5; | |
| 6 | 5 |
| 7 use IMPL::Class::Property; | |
| 8 use IMPL::Security::Auth qw(:Const); | 6 use IMPL::Security::Auth qw(:Const); |
| 9 | 7 |
| 10 BEGIN { | 8 use IMPL::Const qw(:prop); |
| 11 private property _passwordImage => prop_all; | 9 use IMPL::declare { |
| 12 private property _sessionCookie => prop_all; | 10 require => { |
| 13 } | 11 Exception => 'IMPL::Exception', |
| 12 WrongDataException => '-IMPL::WrongDataException' | |
| 13 }, | |
| 14 base => [ | |
| 15 'IMPL::Security::Auth' => undef, | |
| 16 'IMPL::Object' => undef | |
| 17 ], | |
| 18 props => [ | |
| 19 _stage => PROP_ALL, | |
| 20 _salt => PROP_ALL, | |
| 21 _image => PROP_ALL | |
| 22 ] | |
| 23 }; | |
| 24 | |
| 25 use constant { | |
| 26 STAGE_INIT => 1, | |
| 27 STAGE_DONE => 2 | |
| 28 }; | |
| 14 | 29 |
| 15 sub CTOR { | 30 sub CTOR { |
| 16 my ($this,$secData) = @_; | 31 my ($this,$secData) = @_; |
| 17 | 32 |
| 18 my ($passImg,$cookie) = split /\|/,$secData; | 33 my ($stage,$salt,$img) = split /\|/,$secData; |
| 19 | 34 |
| 20 $this->_passwordImage($passImg); | 35 die WrongDataException->new() unless grep $_ == $stage, (STAGE_INIT, STAGE_DONE); |
| 21 $this->_sessionCookie($cookie); | 36 |
| 37 $this->_stage($stage); | |
| 38 $this->_salt($salt); | |
| 39 $this->_image($img); | |
| 40 | |
| 22 } | 41 } |
| 23 | 42 |
| 24 sub secData { | 43 sub secData { |
| 25 my ($this) = @_; | 44 my ($this) = @_; |
| 26 | 45 |
| 27 if ($this->_sessionCookie) { | 46 return join ('|',$this->_stage, $this->_salt , $this->_image ); |
| 28 return join ('|',$this->_passwordImage, $this->_sessionCookie ); | |
| 29 } else { | |
| 30 return $this->_passwordImage; | |
| 31 } | |
| 32 } | 47 } |
| 33 | 48 |
| 34 sub isTrusted { | 49 sub isTrusted { |
| 35 my ($this) = @_; | 50 my ($this) = @_; |
| 36 | 51 |
| 37 $this->_sessionCookie ? 1 : 0; | 52 $this->_stage == STAGE_DONE ? 1 : 0; |
| 38 } | 53 } |
| 39 | 54 |
| 40 sub DoAuth { | 55 sub DoAuth { |
| 41 my ($this,$challenge) = @_; | 56 my ($this,$challenge) = @_; |
| 57 | |
| 58 my $salt = $this->_salt; | |
| 42 | 59 |
| 43 if (Digest::MD5::md5_hex($challenge) eq $this->_passwordImage) { | 60 if (md5_hex($salt, $challenge, $salt) eq $this->_image) { |
| 44 return (AUTH_SUCCESS,$this->_sessionCookie($this->GenSSID)); | 61 if ($this->_stage == STAGE_INIT) { |
| 62 $this->_stage(STAGE_DONE); | |
| 63 } | |
| 64 return (AUTH_SUCCESS, undef); | |
| 45 } elsee { | 65 } elsee { |
| 46 return (AUTH_FAIL,$this->_sessionCookie(undef)); | 66 return (AUTH_FAIL, undef); |
| 47 } | |
| 48 } | |
| 49 | |
| 50 sub ValidateSession { | |
| 51 my ($this,$cookie) = @_; | |
| 52 | |
| 53 die new IMPL::InvalidOperationException("The context is untrusted") unless $this->_sessionCookie; | |
| 54 | |
| 55 if ($cookie eq $this->_sessionCookie) { | |
| 56 return (AUTH_SUCCESS,undef); | |
| 57 } else { | |
| 58 return (AUTH_FAIL,undef); | |
| 59 } | 67 } |
| 60 } | 68 } |
| 61 | 69 |
| 62 sub CreateSecData { | 70 sub CreateSecData { |
| 63 my ($self,%args) = @_; | 71 my ($self,%args) = @_; |
| 64 | 72 |
| 65 die new IMPL::InvalidArgumentException("The parameter is required",'password') unless $args{password}; | 73 die new IMPL::InvalidArgumentException("The parameter is required",'password') unless $args{password}; |
| 66 | 74 |
| 67 return Digest::MD5::md5_hex($args{password}); | 75 my $salt = $self->GenSSID(); |
| 76 return return join ('|',STAGE_INIT, $salt, md5_hex($salt,$args{password},$salt)); | |
| 68 } | 77 } |
| 69 | 78 |
| 70 sub SecDataArgs { | 79 sub SecDataArgs { |
| 71 password => 'SCALAR' | 80 password => 'SCALAR' |
| 72 } | 81 } |
| 73 | 82 |
| 74 1; | 83 1; |
| 75 | 84 |
| 76 __END__ | 85 __END__ |
| 85 | 94 |
| 86 Использует алгоритм MD5 для хранения образа пароля. | 95 Использует алгоритм MD5 для хранения образа пароля. |
| 87 | 96 |
| 88 =head1 MEMBERS | 97 =head1 MEMBERS |
| 89 | 98 |
| 90 =over | 99 =head2 C<CTOR($secData)> |
| 91 | |
| 92 =item C<CTOR($secData)> | |
| 93 | 100 |
| 94 Создает объект аутентификации, передавая ему данные для инициализации. | 101 Создает объект аутентификации, передавая ему данные для инициализации. |
| 95 | 102 |
| 96 =item C<[get]secData> | 103 =head2 C<[get]secData> |
| 97 | 104 |
| 98 Возвращает данные безопасности, которые можно использовать для восстановления | 105 Возвращает данные безопасности, которые можно использовать для восстановления |
| 99 состояния объекта. | 106 состояния объекта. |
| 100 | 107 |
| 101 =item C<[get]isTrusted> | 108 =head2 C<[get]isTrusted> |
| 102 | 109 |
| 103 Является ли объект доверенным для аутентификации сессии (тоесть хранит данные | 110 Является ли объект доверенным для аутентификации сессии (тоесть хранит данные |
| 104 для аутентификации сессии). | 111 для аутентификации сессии). |
| 105 | 112 |
| 106 =item C<DoAuth($challenge)> | 113 =head2 C<DoAuth($challenge)> |
| 107 | 114 |
| 108 Аутентифицирует пользователя. Используется один этап. C<$challenge> | 115 Аутентифицирует пользователя. Используется один этап. C<$challenge> |
| 109 открытый пароль пользователя. | 116 открытый пароль пользователя или cookie сессии. |
| 110 | 117 |
| 111 Возвращает C<($status,$challenge)> | 118 Возвращает C<($status,$challenge)> |
| 112 | 119 |
| 113 =over | 120 =over |
| 114 | 121 |
| 116 | 123 |
| 117 Результат либо C<AUTH_SUCCESS>, либо C<AUTH_FAIL> | 124 Результат либо C<AUTH_SUCCESS>, либо C<AUTH_FAIL> |
| 118 | 125 |
| 119 =item C<$challenge> | 126 =item C<$challenge> |
| 120 | 127 |
| 121 В случае успеха возвращает cookie (уникальный номер) сессии | 128 В случае успеха возвращает cookie (уникальный номер) сессии, либо C<undef> |
| 122 | |
| 123 =back | |
| 124 | |
| 125 =item C<ValidateSession($challenge)> | |
| 126 | |
| 127 Проверяет аутентичность сессии. Использует один этап. C<$challenge> cookie | |
| 128 сессии, полученный при выполнении метода C<DoAuth>. | |
| 129 | |
| 130 Возвращает C<($status,$challenge)> | |
| 131 | |
| 132 =over | |
| 133 | |
| 134 =item C<$status> | |
| 135 | |
| 136 Результат либо C<AUTH_SUCCESS>, либо C<AUTH_FAIL> | |
| 137 | |
| 138 =item C<$challenge> | |
| 139 | |
| 140 Всегда C<undef> | |
| 141 | |
| 142 =back | |
| 143 | 129 |
| 144 =back | 130 =back |
| 145 | 131 |
| 146 =cut | 132 =cut |
