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