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