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