Mercurial > pub > Impl
diff 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 |
line wrap: on
line diff
--- a/Lib/IMPL/Web/Security.pm Sat Sep 29 02:34:47 2012 +0400 +++ b/Lib/IMPL/Web/Security.pm Mon Oct 08 03:37:37 2012 +0400 @@ -1,57 +1,63 @@ package IMPL::Web::Security; use strict; -use parent qw(IMPL::Object IMPL::Security IMPL::Object::Autofill); -require IMPL::Web::Security::Session; - -use IMPL::Class::Property; use IMPL::Security::Auth qw(:Const); - -__PACKAGE__->PassThroughArgs; - -BEGIN { - public property sourceUser => prop_all; - public property sourceSession => prop_all; -} - -sub CTOR { - my ($this) = @_; - - die new IMPL::InvalidArgumentException("An argument is required",'sourceUser') unless $this->sourceUser; - die new IMPL::InvalidArgumentException("An argument is required",'sourceSession') unless $this->sourceSession; -} +use IMPL::declare { + require => { + Exception => 'IMPL::Exception', + NotImplementedException => '-IMPL::NotImplementedException', + SecurityContext => 'IMPL::Security::AbstractContext' + }, +}; sub AuthUser { my ($this,$name,$package,$challenge) = @_; - my $user = $this->sourceUser->find({name => $name}) or return { status => AUTH_FAIL, answer => "Can't find a user '$name'" }; + my $user = $this->FindUserByName($name) + or return { status => AUTH_FAIL, answer => "Can't find a user '$name'" }; - my $auth; - if ( my $secData = $user->secData($package) ) { + my $auth; + if ( my $secData = $user->GetSecData($package) ) { $auth = $package->new($secData); } else { - die new IMPL::SecurityException("Authentication failed","A sec data for the $package isn't found"); + return { + status => AUTH_FAIL, + user => $user + }; } my ($status,$answer) = $auth->DoAuth($challenge); + if ($status != AUTH_FAIL) { + SecurityContext->current->authority->CreateContext( + $user, + $auth, + [$user->roles], + $answer, + $this + ); + } + return { status => $status, - answer => $answer, - context => $this->MakeContext( $user, [$user->roles], $auth ) - } + user => $user + }; } -sub MakeContext { - my ($this,$principal,$roles,$auth) = @_; - - return $this->sourceSession->create( - { - principal => $principal, - rolesAssigned => $roles, - auth => $auth - } - ); +sub FindUserByName { + die NotImplementedException->new(); +} + +sub CreateSession { + die NotImplementedException->new(); +} + +sub GetSession { + die NotImplementedException->new(); +} + +sub SaveSession { + die NotImplementedException->new(); } 1; @@ -88,11 +94,11 @@ сохраняет свое состояние. Поэтому при каждом обращении сервер восстанавливает контекст безопасности. -C<IMPL::Web::Session> Объект обеспечивающий сохранение состояния в рамках одной сессии +C<IMPL::Web::Security::Session> Объект обеспечивающий сохранение состояния в рамках одной сессии пользователя. Кроме контекста безопасности хранит дополнительние данные, которые необходимо сохранить между обработкой запросов. -C<IMPL::Web::User> Объект, устанавливающий связь между идентификатором пользователя +C<IMPL::Web::Security::User> Объект, устанавливающий связь между идентификатором пользователя C<IMPL::Security::Principal>, его ролями и данными безопасности для создания объектов аутентификации C<IMPL::Security::Auth>.