Mercurial > pub > Impl
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 |