Mercurial > pub > Impl
comparison Lib/IMPL/Web/Security.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 | ff1e8fa932f2 |
comparison
equal
deleted
inserted
replaced
229:47f77e6409f7 | 230:6d8092d8ce1b |
---|---|
1 package IMPL::Web::Security; | 1 package IMPL::Web::Security; |
2 use strict; | 2 use strict; |
3 use parent qw(IMPL::Object IMPL::Security IMPL::Object::Autofill); | |
4 | 3 |
5 require IMPL::Web::Security::Session; | |
6 | |
7 use IMPL::Class::Property; | |
8 use IMPL::Security::Auth qw(:Const); | 4 use IMPL::Security::Auth qw(:Const); |
9 | 5 use IMPL::declare { |
10 __PACKAGE__->PassThroughArgs; | 6 require => { |
11 | 7 Exception => 'IMPL::Exception', |
12 BEGIN { | 8 NotImplementedException => '-IMPL::NotImplementedException', |
13 public property sourceUser => prop_all; | 9 SecurityContext => 'IMPL::Security::AbstractContext' |
14 public property sourceSession => prop_all; | 10 }, |
15 } | 11 }; |
16 | |
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 | 12 |
24 sub AuthUser { | 13 sub AuthUser { |
25 my ($this,$name,$package,$challenge) = @_; | 14 my ($this,$name,$package,$challenge) = @_; |
26 | 15 |
27 my $user = $this->sourceUser->find({name => $name}) or return { status => AUTH_FAIL, answer => "Can't find a user '$name'" }; | 16 my $user = $this->FindUserByName($name) |
17 or return { status => AUTH_FAIL, answer => "Can't find a user '$name'" }; | |
28 | 18 |
29 my $auth; | 19 my $auth; |
30 if ( my $secData = $user->secData($package) ) { | 20 if ( my $secData = $user->GetSecData($package) ) { |
31 $auth = $package->new($secData); | 21 $auth = $package->new($secData); |
32 } else { | 22 } else { |
33 die new IMPL::SecurityException("Authentication failed","A sec data for the $package isn't found"); | 23 return { |
24 status => AUTH_FAIL, | |
25 user => $user | |
26 }; | |
34 } | 27 } |
35 | 28 |
36 my ($status,$answer) = $auth->DoAuth($challenge); | 29 my ($status,$answer) = $auth->DoAuth($challenge); |
37 | 30 |
31 if ($status != AUTH_FAIL) { | |
32 SecurityContext->current->authority->CreateContext( | |
33 $user, | |
34 $auth, | |
35 [$user->roles], | |
36 $answer, | |
37 $this | |
38 ); | |
39 } | |
40 | |
38 return { | 41 return { |
39 status => $status, | 42 status => $status, |
40 answer => $answer, | 43 user => $user |
41 context => $this->MakeContext( $user, [$user->roles], $auth ) | 44 }; |
42 } | |
43 } | 45 } |
44 | 46 |
45 sub MakeContext { | 47 sub FindUserByName { |
46 my ($this,$principal,$roles,$auth) = @_; | 48 die NotImplementedException->new(); |
47 | 49 } |
48 return $this->sourceSession->create( | 50 |
49 { | 51 sub CreateSession { |
50 principal => $principal, | 52 die NotImplementedException->new(); |
51 rolesAssigned => $roles, | 53 } |
52 auth => $auth | 54 |
53 } | 55 sub GetSession { |
54 ); | 56 die NotImplementedException->new(); |
57 } | |
58 | |
59 sub SaveSession { | |
60 die NotImplementedException->new(); | |
55 } | 61 } |
56 | 62 |
57 1; | 63 1; |
58 | 64 |
59 __END__ | 65 __END__ |
86 заключается в том, что запросы приходят через значительные интевалы времени, хотя и | 92 заключается в том, что запросы приходят через значительные интевалы времени, хотя и |
87 относятся к одной логической транзакции. В промежутках между запросами сервер не | 93 относятся к одной логической транзакции. В промежутках между запросами сервер не |
88 сохраняет свое состояние. Поэтому при каждом обращении сервер восстанавливает | 94 сохраняет свое состояние. Поэтому при каждом обращении сервер восстанавливает |
89 контекст безопасности. | 95 контекст безопасности. |
90 | 96 |
91 C<IMPL::Web::Session> Объект обеспечивающий сохранение состояния в рамках одной сессии | 97 C<IMPL::Web::Security::Session> Объект обеспечивающий сохранение состояния в рамках одной сессии |
92 пользователя. Кроме контекста безопасности хранит дополнительние данные, которые необходимо | 98 пользователя. Кроме контекста безопасности хранит дополнительние данные, которые необходимо |
93 сохранить между обработкой запросов. | 99 сохранить между обработкой запросов. |
94 | 100 |
95 C<IMPL::Web::User> Объект, устанавливающий связь между идентификатором пользователя | 101 C<IMPL::Web::Security::User> Объект, устанавливающий связь между идентификатором пользователя |
96 C<IMPL::Security::Principal>, его ролями и данными безопасности для создания объектов | 102 C<IMPL::Security::Principal>, его ролями и данными безопасности для создания объектов |
97 аутентификации C<IMPL::Security::Auth>. | 103 аутентификации C<IMPL::Security::Auth>. |
98 | 104 |
99 =head1 MEMBERS | 105 =head1 MEMBERS |
100 | 106 |