Mercurial > pub > Impl
view Lib/IMPL/Security.pm @ 79:2d1c3f713280
ORM concept in development
author | wizard |
---|---|
date | Mon, 05 Apr 2010 00:20:34 +0400 |
parents | 84aa8c395fce |
children | 67eb8eaec3d4 |
line wrap: on
line source
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 Take { my ($self,$principal,$refRoles) = @_; die new IMPL::NotImplementedException(); } sub MakeContext { my ($this,$principal,$refRoles,$auth) = @_; return new IMPL::Security::Context( principal => $principal, rolesAssigned => $refRoles, auth => $auth ); } sub Rules { return \@rules; } 1; __END__ =pod =head1 NAME C<IMPL::Security> - Модуль для работы с функциями авторизации и аутентификации. =head1 SINOPSYS =begin code use IMPL::Security; my Method { my $this = shift; # access check in the current context, using standard configuration IMPL::Security->AccessCheck($this,'Method') or die new IMPL::AccessDeniedException("Access is denied"); #some more results } my DelegationMethod { my $this = shift; #forced delegation my $delegatedContext = IMPL::Security::Context->new( principal => IMPL::Security::Principal->new( name => 'suser' ), rolesAssigned => ['administrator'] ) my $result; $delegatedContext->Impersonate(sub{ $result = $this->Method(); }); return $result; } my SafeDelegationMethod { my $this = shift; my $delegatedContext = IMPL::Security->Take( suser => 'administrator' ); my $result; $delegatedContext->Impersonate(sub{ $result = $this->Method(); }); return $result; } =end code =head1 DESCRIPTION Модуль для инфраструктуры безопасности, реализует основные функции для авторизации и аутентификации пользователей. Модуль аутентификации, реализиция которого зависит от приложения, аутентифицирует пользователя, при этом создается контекст безопасности, который содержит идентификатор пользователя и список активных ролей. При проверке прав доступа происходит последовательная проверка правил доступа, если все правила выполнены, то доступ разрешается. =head1 MEMBERS =over =item C<AccessCheck($object,$desiredAccess,$context)> Метод. Проверка доступа к объекту с определенными правами, в определенном контексте безопасности. =over =item C<$object> Объект доступа. =item C<$desiredAccess> Требуемые права доступа. =item C<$context> Контекст безопасности, если не указан, то используется текущий C<< IMPL::Security::Context->contextCurrent >> =item C<returns> C<true | false> - результат проверки =back =item C<MakeContext($principal,$role,$auth)> Создает контекст безопасности, инициализируя его передданными параметрами. =over =item C<$principal> Объект пользователя =item C<$role> Роль или ссылка на массив ролей =item C<$auth> Объект аутентификации =back =item C<Take($principal,$role)> Метод. Делегирует текущему пользователю полномочия другого пользователя. При этом выполняется проверка правомерности такой операции. В случае неудачи вызывается исключение. =over =item C<$principal> Либо имя пользователя либо объект C<IMPL::Security::Principal>. =item C<$role> Либо имя либо ссылка на роль, или ссылка на массив либо имен, либо ролей. =item C<returns> Новый контекст безопасности. =back =item C<Rules()> Возвращает список правил которые выполняются при проверках доступа. Пререопределите этот метод, чтобы возвращать собственный список правил. Список правил является ссылкой на массив элементами которого являются функции. =begin code package MySecurity; use base qw(IMPL::Security); sub Rules { return [ \&Rule1, \&Rule2, #... ] } =end code =back =cut