Mercurial > pub > Impl
diff Lib/IMPL/Security/AbstractRole.pm @ 230:6d8092d8ce1b
*reworked IMPL::Security
*reworked IMPL::Web::Security
*refactoring
author | sergey |
---|---|
date | Mon, 08 Oct 2012 03:37:37 +0400 |
parents | |
children | 69a1f1508696 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/IMPL/Security/AbstractRole.pm Mon Oct 08 03:37:37 2012 +0400 @@ -0,0 +1,65 @@ +package IMPL::Security::AbstractRole; +use strict; + +use IMPL::Const qw(:prop); + +use parent qw(IMPL::Class::Meta); + +__PACKAGE__->static_accessor_clone( abstractProps => [ + roleName => PROP_RW, + parentRoles => PROP_RW | PROP_LIST +]); + +sub Satisfy { + my ($this,@roles) = @_; + + return 1 unless $this->_FilterRoles( @roles ); + return 0; +} + +sub _FilterRoles { + my ($this,@roles) = @_; + + @roles = grep not (ref $_ ? $this->roleName eq $_->roleName : $this->roleName eq $_), @roles; + + @roles = $_->_FilterRoles(@roles) or return foreach $this->parentRoles ; + + return @roles; +} + +1; + +__END__ + +=pod + +=head1 NAME + +C<IMPL::Security::Role> Роль + +=head1 DESCRIPTION + +Может включать в себя базовые роли. +Имеется метод для проверки наличия необходимых ролей в текущей роли. + +=head1 MEMBERS + +=over + +=item C<[get] roleName> + +Имя роли, ее идентификатор + +=item C<[get,list] parentRoles> + +Список родительских ролей + +=item C<Satisfy(@roles_list)> + +Проверяет наличие ролей указанных ролей из списка @roles_list. +Допускается использование как самих объектов, так и имен ролей. +Возвращает 0 в случае неудачи (хотябы одна роль не была удовлетворена), 1 при наличии необходимых ролей. + +=back + +=cut