Mercurial > pub > Impl
changeset 66:f47f93534005
Documentation
author | wizard |
---|---|
date | Thu, 18 Mar 2010 17:58:33 +0300 |
parents | 2840c4c85db8 |
children | 9f5795a10939 |
files | Lib/IMPL/Resources/Strings.pm Lib/IMPL/Security.pm Lib/IMPL/Security/Context.pm Lib/IMPL/Web/Security.pm Lib/IMPL/Web/Security/Embed.pm _doc/make.pl _test/Resources/app.xml |
diffstat | 7 files changed, 264 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/Lib/IMPL/Resources/Strings.pm Tue Mar 16 17:36:13 2010 +0300 +++ b/Lib/IMPL/Resources/Strings.pm Thu Mar 18 17:58:33 2010 +0300 @@ -75,14 +75,21 @@ sub get { my ($this,$msg_name) = @_; } + 1; __END__ =pod +=head1 NAME + +C<IMPL::Resources::Strings> - Строковые ресурсы + =head1 SYNOPSIS +=begin code + package Foo; use IMPL::Resources::Strings { @@ -97,4 +104,38 @@ } +=end code + +=head1 DESCRIPTION + +Импортирует в целевой модуль функции, которые возвращают локализованные +параметризованные сообщения. + +При импорте ищутся модули по следующему алгоритму: + +В каталогах из массива C<@Locations> ищется файл с относительным путем +C<$Base/$Locale/$ModName>, где C<$Base>, C<$Locale> - глобальные переменные +модуля C<IMPL::Resourses::Strings>, а переменная C<$ModName> получена +путем замены 'C<::>' в имени целевого модуля на 'C</>'. + +Если файл не был найден, то производится поиск в каталоге, где +расположен сам модуль, файла с относительным путем C<locale/$Locale/$ShortModName>, +где C<$ShortModeName> - последняя часть после 'C<::>' из имени целевого модуля. + +Если файл не найден, то используются строки, указанные при объявлении +сообщений в целевом модуле. + +=head1 FORMAT + +=begin code text + +msg_name = any text with named %params% +msg_hello = hello, %name%!!! +msg_resolve = this is a value of the property: %user.age% + +msg_short_err = %error.Message% +msg_full_err = %error% + +=end code text + =cut
--- a/Lib/IMPL/Security.pm Tue Mar 16 17:36:13 2010 +0300 +++ b/Lib/IMPL/Security.pm Thu Mar 18 17:58:33 2010 +0300 @@ -16,6 +16,12 @@ return 1; } +sub Take { + my ($self,$principal,$refRoles) = @_; + + die new IMPL::NotImplementedException(); +} + sub Rules { return \@rules; } @@ -26,6 +32,63 @@ =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' + ), + AssignedRoles => ['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 Модуль для инфраструктуры безопасности, реализует основные функции для авторизации @@ -38,6 +101,77 @@ При проверке прав доступа происходит последовательная проверка правил доступа, если все правила выполнены, то доступ разрешается. +=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<Take($principal,$role)> + +Метод. Делегирует текущему пользователю полномочия другого пользователя. При этом выполняется проверка +правомерности такой операции. В случае неудачи вызывается исключение. + +=over + +=item C<$principal> + +Либо имя пользователя либо объект C<IMPL::Security::Principal>. + +=item C<$role> + +Либо имя либо ссылка на роль, или ссылка на массив либо имен, либо ролей. + +=item C<returns> + +Новый контекст безопасности. + +=back + +=item C<Roles()> + +Возвращает список правил которые выполняются при проверках доступа. Пререопределите этот +метод, чтобы возвращать собственный список правил. Список правил является ссылкой на массив +элементами которого являются функции. + +=begin code + +package MySecurity; + +use base qw(IMPL::Security); + +sub Rules { + return [ + \&Rule1, + \&Rule2, + #... + ] +} + +=end code + +=back =cut \ No newline at end of file
--- a/Lib/IMPL/Security/Context.pm Tue Mar 16 17:36:13 2010 +0300 +++ b/Lib/IMPL/Security/Context.pm Thu Mar 18 17:58:33 2010 +0300 @@ -13,7 +13,7 @@ BEGIN { public property Principal => prop_get; - public property AssignedRoles => prop_all; + public property AssignedRoles => prop_all | prop_list; public property AuthSession => prop_all; }
--- a/Lib/IMPL/Web/Security.pm Tue Mar 16 17:36:13 2010 +0300 +++ b/Lib/IMPL/Web/Security.pm Thu Mar 18 17:58:33 2010 +0300 @@ -10,16 +10,16 @@ Модуль для аутентификации и авторизации веб запроса. -Получает запрос, вчленяет из него информацию для авторизации, производит авторизацию пользователя +Получает запрос, вычленяет из него информацию для авторизации, производит авторизацию пользователя и создает контекст безопасности. При этом использует указанные модули аутентификации. -Информацию для аутентификации модкль получает через соответствующие адаптеры. +Информацию для аутентификации модуль получает через соответствующие адаптеры. =item C<IMPL::Web::Security::Server> -аутентифицирует пользователя на основе данных, предоставленных сервером +Аутентифицирует пользователя на основе данных, предоставленных сервером =item C<IMPL::Web::Security::Embed>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/Web/Security/Embed.pm Thu Mar 18 17:58:33 2010 +0300 @@ -0,0 +1,3 @@ +package IMPL::Web::Security::Embed; + +use base qw(IMPL::Object); \ No newline at end of file
--- a/_doc/make.pl Tue Mar 16 17:36:13 2010 +0300 +++ b/_doc/make.pl Thu Mar 18 17:58:33 2010 +0300 @@ -32,7 +32,7 @@ open my $hPod, "<:encoding(cp1251)", $fname or die "Failed to open $fname for input: $!"; open my $hOut, ">:encoding(utf-8)", $fnameOut or die "Failed to open $fnameOut for output: $!"; - my $parser = Pod::POM->new( ); + my $parser = Pod::POM->new(); my $pom = $parser->parse_file($hPod); @@ -75,7 +75,7 @@ foreach my $itemKey (sort keys %{$index->{items}}) { my $item = $index->{items}{$itemKey}; print $hout "<li>"; - print $hout "<a href='$item->{url}'>" if $item->{url}; + print $hout "<a target='content' href='$item->{url}'>" if $item->{url}; print $hout $item->{name}; print $hout "</a>" if $item->{url}; build_index($hout,$item) if $item->{items}; @@ -91,7 +91,7 @@ process_dir($LibDir); -open my $hout, ">:encoding(utf-8)", "$OutDir/index.html" or die "failed to open index.html for output: $!"; +open my $hout, ">:encoding(utf-8)", "$OutDir/toc.html" or die "failed to open toc.html for output: $!"; print $hout <<HEADER; <html> @@ -109,9 +109,28 @@ </html> FOOTER +undef $hout; + +open $hout, ">:encoding(utf-8)","$OutDir/index.html" or die "failed to open index.html for output: $!"; + +print $hout <<FRAMES; +<html> +<head> +<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/> +<title>IMPL reference</title> +</head> +<frameset cols="30%,*"> + <frame name="toc" src="toc.html"/> + <frame name="content" src="about:blank"/> +</frameset> +</html> +FRAMES + package PodViewHTML; use base qw(Pod::POM::View::HTML); +use IPC::Open2; + sub view_pod { my ($self, $pod) = @_; return "<html>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /> @@ -121,7 +140,7 @@ } sub view_begin { my ($self,$begin) = @_; - $begin->format =~ /code/i ? return "<pre>\n".escape_html(join ("",$begin->text()))."</pre>\n" : return $self->SUPER::view_begin($begin); + return code_highlight(join ("",$begin->content()),$begin->format); } sub escape_html { @@ -169,3 +188,50 @@ sub view_seq_code { goto &view_seq_link; } + +sub view_code { + my ($self,$code) = @_; + + return code_highlight($code); +} + +sub code_highlight { + my ($text,$format) = @_; + + if ($format) { + $format =~ s/code//i; + $format =~ s/\s+//g; + } + + $format ||= 'perl'; + + return "<pre>".escape_html($text)."</pre>\n" if $format =~ /^text$/i; + + + + my ($hin,$hout); + local $/ = undef; + my $pid = eval { open2( + $hin, $hout, highlight => ( + '--syntax' => $format, + '--html', + '--fragment', + '--inline-css', + '--enclose-pre' + ) + ) } or return "<pre>".escape_html($text)."</pre>\n"; + + binmode $hout, ':encoding(utf8)'; + binmode $hin, ':encoding(utf8)'; + + print $hout $text; + + undef $hout; + + my $fragment = <$hin>; + + undef $hin; + + return $fragment; + +}
--- a/_test/Resources/app.xml Tue Mar 16 17:36:13 2010 +0300 +++ b/_test/Resources/app.xml Thu Mar 18 17:58:33 2010 +0300 @@ -1,5 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <Application id='app' type="Test::Web::Application::Instance"> + + <!-- Begin custom properties --> <name>Sample application</name> <dataSource type='IMPL::Config::Activator' id='ds'> <factory>IMPL::Object</factory> @@ -13,11 +15,18 @@ <parameters type='HASH'> <ds refid='ds'/> </parameters> - </securityMod> + </securityMod> + <!-- End custom properties --> + + <!-- direct access to the activators --> <options type="HASH"> <dataSource refid='ds'/> </options> + + <!-- Set default output encoding, can be changed due query handling --> <responseCharset>utf-8</responseCharset> + + <!-- Actions creation configuration --> <factoryAction type="IMPL::Object::Factory"> <factory>IMPL::Web::Application::Action</factory> <parameters type='HASH'> @@ -29,6 +38,8 @@ </responseFactory> </parameters> </factoryAction> + + <!-- Query processing --> <handlersQuery type="IMPL::Object::List"> <item type="IMPL::Web::QueryHandler::PageFormat"> <templatesCharset>cp1251</templatesCharset>