Mercurial > pub > Impl
changeset 51:a1498298d3ee
Security in progress
author | wizard@linux-odin.local |
---|---|
date | Mon, 01 Mar 2010 17:25:36 +0300 |
parents | 521c9c1a3ea1 |
children | 15d720913562 cf23fd8423f4 |
files | .includepath .project .settings/org.eclipse.core.resources.prefs .settings/org.eclipse.ltk.core.refactoring.prefs Lib/IMPL/SVN.pm Lib/IMPL/Security.pm Lib/IMPL/Security/Auth.pm Lib/IMPL/Security/Auth/AuthResult.pm Lib/IMPL/Security/Auth/Simple.pm Lib/IMPL/Security/AuthResult.pm Lib/IMPL/Security/Context.pm Lib/IMPL/Security/Role.pm Lib/IMPL/Security/Rule/RoleCheck.pm |
diffstat | 13 files changed, 229 insertions(+), 33 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.includepath Mon Mar 01 17:25:36 2010 +0300 @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="UTF-8"?> +<includepath> + <includepathentry path="${resource_loc:/Impl/Lib}" /> +</includepath> +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.project Mon Mar 01 17:25:36 2010 +0300 @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>Impl</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.epic.perleditor.perlbuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.epic.perleditor.perlnature</nature> + </natures> +</projectDescription>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.settings/org.eclipse.core.resources.prefs Mon Mar 01 17:25:36 2010 +0300 @@ -0,0 +1,3 @@ +#Fri Feb 26 10:46:20 MSK 2010 +eclipse.preferences.version=1 +encoding/<project>=cp1251
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.settings/org.eclipse.ltk.core.refactoring.prefs Mon Mar 01 17:25:36 2010 +0300 @@ -0,0 +1,3 @@ +#Fri Feb 26 10:46:20 MSK 2010 +eclipse.preferences.version=1 +org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=false
--- a/Lib/IMPL/SVN.pm Sat Feb 27 16:28:45 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -package IMPL::SVN; -use strict; - -use base qw(IMPL::Object); -use IMPL::Object::Property; - -BEGIN { - public virtual _direct property SvnClient => get; -} - -sub UpdateBatch { - my ($this,$revstart,$revend) = @_; - - -} \ No newline at end of file
--- a/Lib/IMPL/Security.pm Sat Feb 27 16:28:45 2010 +0300 +++ b/Lib/IMPL/Security.pm Mon Mar 01 17:25:36 2010 +0300 @@ -1,4 +1,24 @@ package IMPL::Security; +require IMPL::Security::Context; +require IMPL::Security::Rule::RoleCheck; + +our @rules = ( + \&IMPL::Security::Rule::RoleCheck::SatisfyAll +); + +sub AccessCheck { + my ($self, $object, $desiredAccess, $context) = @_; + + $context = IMPL::Security::Context->contextCurrent; + + $_->() or return 0 foreach @{$self->Rules}; + + return 1; +} + +sub Rules { + return \@rules; +} 1; @@ -8,6 +28,16 @@ =head1 DESCRIPTION +Модуль для инфраструктуры безопасности, реализует основные функции для авторизации +и аутентификации пользователей. + +Модуль аутентификации, реализиция которого зависит от приложения, аутентифицирует +пользователя, при этом создается контекст безопасности, который содержит +идентификатор пользователя и список активных ролей. + +При проверке прав доступа происходит последовательная проверка правил доступа, +если все правила выполнены, то доступ разрешается. + =cut \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/Security/Auth.pm Mon Mar 01 17:25:36 2010 +0300 @@ -0,0 +1,36 @@ +package IMPL::Security::Auth; + +use constant { + SUCCESS => 1, + INCOMPLETE => 2, + FAIL => 3 +}; + +use base qw(Exporter); + +our @EXPORT_OK = qw(&SUCCESS &INCOMPLETE &FAI); +our %EXPORT_TAGS = (Const => [qw(&SUCCESS &INCOMPLETE &FAI)]); + +1; + +__END__ + +=pod + +=head1 DESCRIPTION + +Базовыйы модуль для авторизации пользователей. + +Процесс авторизации состоит зи следующих шагов + +1. Клиент отправляет на сервер запрос для авторизации с начальными параметрами. +2. Сервер получает запрос, находит данные аутентификации для клиента, +производит аутентификацию +3. Модуль аутентификации возвращает результат, на основе которого +либо формируется контекст безопасности, либо продолжается процесс аутентификации + +Полученный контекст безопасности содержит объект для доступа к сессии аутентификации, +в которм содержится уникальные свойства сессии, например идентификатор, сеансовые ключи +и т.д. + +=cut \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/Security/Auth/AuthResult.pm Mon Mar 01 17:25:36 2010 +0300 @@ -0,0 +1,15 @@ +package IMPL::Security::Auth::Result; +use strict; + +use base qw(IMPL::Object); +use IMPL::Class::Property; +use IMPL::Class::Property::Direct; + +BEGIN { + public _direct property State => prop_get; + public _direct property ClientSecData => prop_get; + public _direct property AuthMod => prop_get; +} + + +1;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/Security/Auth/Simple.pm Mon Mar 01 17:25:36 2010 +0300 @@ -0,0 +1,27 @@ +package IMPL::Security::Auth::Simple; + +use base qw(IMPL::Security::Auth); +use Digest::MD5; +import IMPL::Security::Auth qw(:Const); + +sub DoAuth { + my ($this,$clientData,$serverData) = @_; + + if (Digest::MD5::md5_hex($clientData) eq $serverData) { + return SUCCESS; + } elsee { + return FAIL; + } +} + +1; + +__END__ + +=pod + +=head1 DESCRIPTION + +Модуль простой авторизации + +=cut \ No newline at end of file
--- a/Lib/IMPL/Security/AuthResult.pm Sat Feb 27 16:28:45 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,16 +0,0 @@ -package IMPL::Security::AuthResult; -use strict; - -use base qw(IMPL::Object); -use IMPL::Class::Property; -use IMPL::Class::Property::Direct; - -BEGIN { - public _direct property State => prop_get; - public _direct property Session => prop_get; - public _direct property ClientSecData => prop_get; - public _direct property AuthMod => prop_get; -} - - -1;
--- a/Lib/IMPL/Security/Context.pm Sat Feb 27 16:28:45 2010 +0300 +++ b/Lib/IMPL/Security/Context.pm Mon Mar 01 17:25:36 2010 +0300 @@ -8,12 +8,13 @@ require IMPL::Security::Principal; -my $current = __PACKAGE__->nobody; +my $current; my $nobody; BEGIN { public property Principal => prop_get; public property AssignedRoles => prop_all; + public property AuthSession => prop_all; } sub Impersonate { @@ -33,10 +34,17 @@ } } -sub nobody { +sub contextNobody { my ($self) = @_; $nobody = $self->new(Principal => IMPL::Security::Principal->nobody, AssignedRoles => undef) unless $nobody; $nobody; } +sub contextCurrent { + my ($self) = @_; + + $current = __PACKAGE__->nobody unless $current; + $current; +} + 1;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/Security/Role.pm Mon Mar 01 17:25:36 2010 +0300 @@ -0,0 +1,67 @@ +package IMPL::Security::Role; + +use base qw(IMPL::Object); + +use IMPL::Class::Property; + +BEGIN { + public property roleName => prop_get; + public property parentRoles => prop_get; +} + +sub CTOR { + my ($this,$name,$parentRoles) = @_; + + $this->roleName($name); + $this->parentRoles($parentRoles); +} + +sub Satisfy { + my ($this,@roles) = @_; + + return 1 unless $this->_FilterRoles( @roles ); +} + +sub _FilterRoles { + my ($this,@roles) = @_; + + @roles = grep not (ref $_ ? $this == $_ : $this->roleName eq $_), @roles; + + @roles = $_->_FilterRoles(@roles) or return foreach @{$this->parentRoles} ; + + return @roles; +} + + +1; + +__END__ + +=pod + +=head1 DESCRIPTION + +Роль. Может включать в себя базовые роли. +Имеется метод для проверки наличия необходимых ролей в текущей роли. + +=head1 MEMBERS + +=over + +=item C<roleName> + +Имя роли, ее идентификатор + +=item C<parentRoles> + +Список родительских ролей + +=item C<Satisfy(@roles_list)> + +Проверяет наличие ролей указанных ролей из списка @roles_list. +Допускается использование как самих объектов, так и имен ролей. +Возвращает 0 в случае неудачи, 1 при наличии необходимых ролей + +=back + +=cut \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/Security/Rule/RoleCheck.pm Mon Mar 01 17:25:36 2010 +0300 @@ -0,0 +1,16 @@ +package IMPL::Security::Rule::RoleCheck; + +require IMPL::Security::Role; + +sub SatisfyAll { + my ($secPackage,$object,$desiredAccess,$context) = @_; + + my $roleEffective = new IMPL::Security::Role ( effective => $context->AssignedRoles ); + + return $roleEffective->Satisfy(ExtractRoles($object)); +} + +sub _ExtractRoles { + return (); +} +