Общие сведения о разрешениях пользователей и способах их применения

Я разрабатываю модуль для сайта с помощью Social Engine , который использует Zend Framework. Я новичок в Zend Framework и Social Engine, но у меня есть опыт работы с архитектурой OOP и MVC, поэтому я могу относительно быстро освоить основы.

Это тестовый модуль, который я разрабатываю, поэтому только что создал простой модуль, в котором пользователь может создавать, редактировать или удалять информацию о компакт-диске. Затем есть виджет, который может отображаться там, где им нравится, который показывает там информацию о компакт-диске.

Сейчас я нахожусь в том месте, где мне нужно установить разрешения на то, какие компакт-диски люди могут видеть и т. д. Поэтому я изучил другие модули и нашел модуль опроса в качестве конкретного примера.

Глядя на другие модули, я понял, что когда вы что-то создаете, они позволяют пользователю устанавливать свои разрешения вручную.

Поэтому добавил этот код в мою форму, чтобы создать поле выбора с соответствующими разрешениями:

$auth = Engine_Api::_()->authorization()->context;
$user = Engine_Api::_()->user()->getViewer();
$viewOptions = (array) Engine_Api::_()->authorization()->getAdapter('levels')->getAllowed('ryan', $user, 'auth_view');
$viewOptions = array_intersect_key($availableLabels, array_flip($viewOptions));

$privacy = null;

if( !empty($viewOptions) && count($viewOptions) >= 1 ) {
    // Make a hidden field
    if(count($viewOptions) == 1) {
        //$this->addElement('hidden', 'auth_view', array('value' => key($viewOptions)));
        $privacy  = new Zend_Form_Element_Hidden('auth_view');
        $privacy->setValue(key($viewOptions));
        // Make select box
    } else {
        $privacy = new Zend_Form_Element_Select('auth_view');
        $privacy->setLabel('Privacy')
                ->setDescription('Who may see this CD?')
                ->setMultiOptions($viewOptions)
                ->setValue(key($viewOptions));
        /*$this->addElement('Select', 'auth_view', array(
            'label' => 'Privacy',
            'description' => 'Who may see this CD?',
            'multiOptions' => $viewOptions,
            'value' => key($viewOptions),
        ));*/
    }
}

$this->addElements(array($artist, $title, $privacy, $submit));

Честно говоря, я не совсем уверен, что делает этот код, кроме того, что явно создает поле выбора и заполняет его указанными значениями.

Поэтому, если пользователь выбирает «Все», каждый должен иметь возможность удалять и редактировать этот компакт-диск и так далее.

Очевидно, я думал, что в контроллере должен быть какой-то код, который мог бы определять, есть ли у пользователя права на просмотр каждого компакт-диска и т. д.

Итак, просканировав контроллер опроса, я обнаружил, что это функция инициализации контроллера :

public function init() {
    // Get subject
    $poll = null;
    if( null !== ($pollIdentity = $this->_getParam('poll_id')) ) {
        $poll = Engine_Api::_()->getItem('poll', $pollIdentity);
        if( null !== $poll ) {
            Engine_Api::_()->core()->setSubject($poll);
        }
    }

    // Get viewer
    $this->view->viewer = $viewer = Engine_Api::_()->user()->getViewer();
    $this->view->viewer_id = Engine_Api::_()->user()->getViewer()->getIdentity();

    // only show polls if authorized
    $resource = ( $poll ? $poll : 'poll' );
    $viewer = ( $viewer && $viewer->getIdentity() ? $viewer : null );
    if( !$this->_helper->requireAuth()->setAuthParams($resource, $viewer, 'view')->isValid() ) {
        return;
    }
}

. И в каждом действии вверху у них есть какой-то другой код авторизации, одним из таких примеров является editAction, у которого этот код находится прямо вверху:

// Check auth
if( !$this->_helper->requireUser()->isValid() ) {
    return;
}
if( !$this->_helper->requireSubject()->isValid() ) {
    return;
}
if( !$this->_helper->requireAuth()->setAuthParams(null, null, 'edit')->isValid() ) {
    return;
}

также в том же действии есть несколько других битов, я не понимаю, что они делают,ниже случайные фрагменты из editActionв контроллере опроса:

$auth = Engine_Api::_()->authorization()->context;
$roles = array('owner', 'owner_member', 'owner_member_member', 'owner_network', 'registered', 'everyone');

// Populate form with current settings
$form->search->setValue($poll->search);
foreach( $roles as $role ) {
    if( 1 === $auth->isAllowed($poll, $role, 'view') ) {
        $form->auth_view->setValue($role);
    }
    if( 1 === $auth->isAllowed($poll, $role, 'comment') ) {
        $form->auth_comment->setValue($role);
    }
}

// CREATE AUTH STUFF HERE
if( empty($values['auth_view']) ) {
    $values['auth_view'] = array('everyone');
}
if( empty($values['auth_comment']) ) {
    $values['auth_comment'] = array('everyone');
}

$viewMax = array_search($values['auth_view'], $roles);
$commentMax = array_search($values['auth_comment'], $roles);

Моя проблема в том, что я действительно мало что понимаю, если что-то из вышеперечисленного, и после того, как я просидел над ним пару дней и погуглил, чтобы мои пальцы болели, я до сих пор не имею ни малейшего понятия, если я на 100% честен. Может ли что-то из вышеперечисленного быть прояснено для меня, помочь объяснить мне что-то и, если возможно, как я могу применить разрешения, которые я хочу, к моему модулю.

5
задан ByteNudger 17 July 2012 в 20:55
поделиться