view Lib/IMPL/Web/Security.pm @ 171:59e5fcb59d86

Исправления, изменена концепция веб-форм
author sourcer
date Mon, 06 Jun 2011 03:30:36 +0400
parents 4267a2ac3d46
children d1676be8afcc
line wrap: on
line source

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;
}

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 $auth;	
	if ( my $secData = $user->secData($package) ) {
		$auth = $package->new($secData);
	} else {
		die new IMPL::SecurityException("Authentication failed","A sec data for the $package isn't found");
	}
	
	my ($status,$answer) = $auth->DoAuth($challenge);
	
	return {
		status => $status,
		answer => $answer,
		context => $this->MakeContext( $user, [$user->roles], $auth )
	}
}

sub MakeContext {
	my ($this,$principal,$roles,$auth) = @_;
	
	return $this->sourceSession->create(
		{
			principal => $principal,
			rolesAssigned => $roles,
			auth => $auth
		}
	);
}

1;

__END__

=pod

=head1 NAME

C<IMPL::Web::Security>       .

=head1 SINOPSYS

=begin code xml

<security type='IMPL::Config::Activator'>
	<factory>IMPL::Web::Security</factory>
	<parameters type='HASH'>
		<sessionFactory type='IMPL::Object::Factory'>
			<factory type='IMPL::Object::Factory'>App::Data::Session</factory>
			<method>insert</method>
		</sessionFactory>
	</parameters>
</security>

=end code xml

=head1 DESCRIPTION

      .  
  ,       ,  
    .      
  .      
 .

C<IMPL::Web::Session>        
.      ,  
   .

C<IMPL::Web::User> ,     
C<IMPL::Security::Principal>,        
 C<IMPL::Security::Auth>.

=head1 MEMBERS

=cut