52
|
1 package IMPL::Web::Security;
|
81
|
2 use strict;
|
73
|
3 use base qw(IMPL::Object IMPL::Security IMPL::Object::Autofill);
|
|
4
|
81
|
5 require IMPL::Web::Security::Session;
|
|
6
|
73
|
7 use IMPL::Class::Property;
|
81
|
8 use IMPL::Security::Auth qw(:Const);
|
73
|
9
|
|
10 __PACKAGE__->PassThroughArgs;
|
|
11
|
|
12 BEGIN {
|
81
|
13 public property sourceUser => prop_all;
|
|
14 public property sourceSession => prop_all;
|
73
|
15 }
|
|
16
|
107
|
17 sub CTOR {
|
|
18 my ($this) = @_;
|
|
19
|
|
20 die new IMPL::InvalidArgumentException("An argument is required",'sourceUser') unless $this->sourceUser;
|
|
21 die new IMPL::InvalidArgumentException("An argument is required",'sourceSession') unless $this->sourceSession;
|
|
22 }
|
|
23
|
81
|
24 sub AuthUser {
|
|
25 my ($this,$name,$package,$challenge) = @_;
|
|
26
|
97
|
27 my $user = $this->sourceUser->find({name => $name}) or return { status => AUTH_FAIL, answer => "Can't find a user '$name'" };
|
81
|
28
|
|
29 my $auth;
|
|
30 if ( my $secData = $user->secData($package) ) {
|
|
31 $auth = $package->new($secData);
|
|
32 } else {
|
|
33 die new IMPL::SecurityException("Authentication failed","A sec data for the $package isn't found");
|
|
34 }
|
79
|
35
|
81
|
36 my ($status,$answer) = $auth->DoAuth($challenge);
|
|
37
|
|
38 if ($status == AUTH_FAIL) {
|
|
39 die new IMPL::SecurityException("Authentication failed","DoAuth failed");
|
|
40 }
|
|
41
|
|
42 return {
|
|
43 status => $status,
|
|
44 answer => $answer,
|
94
|
45 context => $this->MakeContext( $user, [$user->roles], $auth )
|
81
|
46 }
|
73
|
47 }
|
|
48
|
81
|
49 sub MakeContext {
|
|
50 my ($this,$principal,$roles,$auth) = @_;
|
73
|
51
|
83
|
52 return $this->sourceSession->create(
|
81
|
53 {
|
|
54 principal => $principal,
|
|
55 rolesAssigned => $roles,
|
|
56 auth => $auth
|
|
57 }
|
|
58 );
|
73
|
59 }
|
|
60
|
52
|
61 1;
|
|
62
|
|
63 __END__
|
|
64
|
|
65 =pod
|
|
66
|
73
|
67 =head1 NAME
|
|
68
|
|
69 C<IMPL::Web::Security> Модуль для аутентификации и авторизации веб запроса.
|
|
70
|
|
71 =head1 SINOPSYS
|
|
72
|
|
73 =begin code xml
|
|
74
|
|
75 <security type='IMPL::Config::Activator'>
|
|
76 <factory>IMPL::Web::Security</factory>
|
|
77 <parameters type='HASH'>
|
|
78 <sessionFactory type='IMPL::Object::Factory'>
|
|
79 <factory type='IMPL::Object::Factory'>App::Data::Session</factory>
|
|
80 <method>insert</method>
|
|
81 </sessionFactory>
|
|
82 </parameters>
|
|
83 </security>
|
|
84
|
|
85 =end code xml
|
|
86
|
52
|
87 =head1 DESCRIPTION
|
|
88
|
73
|
89 Отвечает за инфраструктуру аутентификации и авторизации запросов. Основная особенность
|
|
90 заключается в том, что запросы приходят через значительные интевалы времени, хотя и
|
|
91 относятся к одной логической транзакции. В промежутках между запросами сервер не
|
|
92 сохраняет свое состояние. Поэтому при каждом обращении сервер восстанавливает
|
|
93 контекст безопасности.
|
52
|
94
|
73
|
95 C<IMPL::Web::Session> Объект обеспечивающий сохранение состояния в рамках одной сессии
|
|
96 пользователя. Кроме контекста безопасности хранит дополнительние данные, которые необходимо
|
|
97 сохранить между обработкой запросов.
|
52
|
98
|
73
|
99 C<IMPL::Web::User> Объект, устанавливающий связь между идентификатором пользователя
|
|
100 C<IMPL::Security::Principal>, его ролями и данными безопасности для создания объектов
|
|
101 аутентификации C<IMPL::Security::Auth>.
|
52
|
102
|
73
|
103 =head1 MEMBERS
|
52
|
104
|
|
105 =cut |