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 |