comparison lib/IMPL/Web/Security.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::Web::Security;
2 use strict;
3
4 use IMPL::Security::Auth qw(:Const);
5 use IMPL::declare {
6 require => {
7 Exception => 'IMPL::Exception',
8 NotImplementedException => '-IMPL::NotImplementedException',
9 ArgException => '-IMPL::InvalidArgumentException',
10 SecurityContext => 'IMPL::Security::AbstractContext'
11 },
12 };
13
14 use constant {
15 ERR_NO_SUCH_USER => -1,
16 ERR_NO_SEC_DATA => -2,
17 ERR_NO_AUTHORITY => -3,
18 ERR_NO_SEC_CONTEXT => -4,
19 ERR_AUTH_FAIL => -5
20 };
21
22 sub interactiveAuthPackage {
23 die NotImplementedException->new();
24 }
25
26 sub users {
27 die NotImplementedException->new();
28 }
29
30 sub roles {
31 die die NotImplementedException->new();
32 }
33
34 sub sessions {
35 die NotImplementedException->new();
36 }
37
38 sub AuthUser {
39 my ($this,$name,$challenge,$roles,$package) = @_;
40
41 $package ||= $this->interactiveAuthPackage;
42 $roles ||= [];
43
44 my $user = $this->users->GetById($name)
45 or return {
46 status => AUTH_FAIL,
47 code => ERR_NO_SUCH_USER
48 };
49
50 my $auth;
51 if ( my $secData = $user->GetSecData($package) ) {
52 $auth = $package->new($secData);
53 } else {
54 return {
55 status => AUTH_FAIL,
56 code => ERR_NO_SEC_DATA,
57 user => $user
58 };
59 }
60
61 return {
62 status => AUTH_FAIL,
63 code => ERR_NO_SEC_CONTEXT
64 } unless SecurityContext->current;
65
66 return {
67 status => AUTH_FAIL,
68 code => ERR_NO_AUTHORITY
69 } unless SecurityContext->current->authority;
70
71 my $status = SecurityContext->current->authority->InitSession(
72 $user,
73 $roles,
74 $auth,
75 $challenge
76 );
77
78 return {
79 status => $status,
80 code => ($status == AUTH_FAIL ? ERR_AUTH_FAIL : 0),
81 user => $user
82 };
83 }
84
85 sub Logout {
86 my ($this) = @_;
87
88 my $session = SecurityContext->current;
89 if($session && $session->authority) {
90 $session->authority->CloseSession($session);
91
92 $this->sessions->Delete($session);
93 }
94 }
95
96 sub CreateSecData {
97 my ($this,$package,$params) = @_;
98
99 die ArgException->new(params => 'A hash reference is required')
100 unless ref($params) eq 'HASH';
101
102 return $package->CreateSecData(%$params);
103 }
104
105 1;
106
107 __END__
108
109 =pod
110
111 =head1 NAME
112
113 C<IMPL::Web::Security> Модуль для аутентификации и авторизации веб запроса.
114
115 =head1 DESCRIPTION
116
117 Текущий модуль обеспечивает функции верхнего уровня для работы с системой
118 безопасности. Поскольку модуль является абстрактым, конкретные функции
119 хранения и реализацию объектов модели безопасности должно обеспечить само
120 приложение.
121
122 Сама система безопасности в веб приложении состоит из двух частей
123
124 =over
125
126 =item Модель системы безопасности
127
128 Предоставляет такие объкты безопасности, как пользователь, сессия роль,
129 определяет правила проверки прав доступа субъекта к объекту.
130
131 =item Модуль безопасности
132
133 Контекст безопасности создается именно этим модулем.
134
135 Как правило встраивается в транспортный уровеь в виде обработчика
136 C<IMPL::Web::Handler> и реализует непосредственно протокол аутентификации и
137 обмена с пользователем.
138
139 Также модуль безопасности использует модель для хранения сессий и данных
140 аутентификции.
141
142 =back
143
144 =head1 MEMBERS
145
146 =head2 C<AuthUser($name,$package,$challenge)>
147
148 Инициирует создание новой сессии используя провайдера безопасности текущего
149 контекста безопасности.
150
151 =over
152
153 =item C<$name>
154
155 Имя пользователя, которое будет использоваться при поиске его в БД.
156
157 =item C<$package>
158
159 Имя модуля аутентификации, например, C<IMPL::Security::Auth::Simple>.
160
161 =item C<$challenge>
162
163 Данные, полученные от клиента, которые будут переданы модулю аутентификации для
164 начала процесса аутентификации и создания сессии.
165
166 =back
167
168 Функция возвращает хеш с элементами
169
170 =over
171
172 =item C<status>
173
174 Статус аутентификации - отражает общее состояние процесса ацтентификации,
175
176 =over
177
178 =item C<AUTH_FAIL>
179
180 Аутентификация неудачная, сессия не создана.
181
182 =item C<AUTH_INCOMPLETE>
183
184 Аутентификация требует дополнительных шагов, сессия создана, но еще не доверена.
185
186 =item C<AUTH_SUCCESS>
187
188 Аутентификация успешно проведена, сессия создана.
189
190 =back
191
192 =item C<code>
193
194 =back
195
196 =cut