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