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>.