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