5

Zend Framework を使用するSocial Engineを使用してサイト用のモジュールを開発しています。私は Zend Framework と Social Engine の両方に慣れていませんが、OOP と MVC アーキテクチャの経験があるので、比較的早く基本を理解することができます。

私が開発中のテスト モジュールなので、ユーザーが CD 情報を作成、編集、または削除できる単純なモジュールを作成しました。次に、CD 情報を表示する好きな場所に表示できるウィジェットがあります。

私は今、人々が見ることができるCDなどの許可を設定する必要があるところにいます。そこで他のモジュールを調べたところ、Pollモジュールが具体的な例であることがわかりました。

他のモジュールを見ると、何かを作成するときに、ユーザーが自分の権限を手動で設定できることがわかりました。

したがって、このコードをフォームに追加して、関連する権限を持つ選択ボックスを作成しました。

$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));

正直なところ、明らかに選択ボックスを作成して指定された値で埋める以外に、このコードが何をするのか完全にはわかりません。

したがって、ユーザーが「Everyone」を選択すると、誰もがその CD を削除および編集できるようになります。

明らかに、コントローラーには、ユーザーが各CDなどを表示する権利があるかどうかを判断するコードが必要だと思いました.

Poll コントローラーをスキャンすると、コントローラーの init 関数にあることがわかりました。

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;
    }
}

そして、上部の各アクションには、いくつかの異なる認証コードがあります。そのような例の 1 つは、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、Poll コントローラーのランダムなスニペットです。

$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%正直であるかどうかはまだわかりません. 上記のいずれかを解決して、説明を手伝ってください。可能であれば、必要な権限をモジュールに適用する方法を教えてください。

4

2 に答える 2

7

Authorization の使用方法について簡単に説明しますが、SocialEngine のコードを確認して、より詳細な情報を推測する必要があります。注意として、SocialEngine のドキュメントをコンパイルしていませんが、開発者はコード全体で PHPDocumentor スタイルの構文を使用しており、Neatbeans (http://netbeans.org/) などの IDE を使用してその情報にすばやくアクセスできます。

SocialEngine には、アクション コントローラー内でのクエリ承認に使用されるいくつかのコントローラー アクション ヘルパー クラスがあります。

  • アプリケーション/モジュール/承認/コントローラー/アクション/ヘルパー/RequireAuth.php
  • アプリケーション/モジュール/コア/コントローラー/アクション/ヘルパー/RequireAbstract.php
  • アプリケーション/モジュール/コア/コントローラー/アクション/ヘルパー/RequireAdmin.php
  • アプリケーション/モジュール/コア/コントローラー/アクション/ヘルパー/RequireSubject.php
  • アプリケーション/モジュール/コア/コントローラー/アクション/ヘルパー/RequireUser.php

ほとんどの場合、あなたが気にする唯一のものは次のとおりです。

  • アプリケーション/モジュール/承認/コントローラー/アクション/ヘルパー/RequireAuth.php
  • アプリケーション/モジュール/コア/コントローラー/アクション/ヘルパー/RequireSubject.php
  • アプリケーション/モジュール/コア/コントローラー/アクション/ヘルパー/RequireUser.php

これらのヘルパーの使用方法の良い例は、Album_AlbumController クラスにあります: application/modules/Album/controllers/AlbumController.php

public function init()
{
if( !$this->_helper->requireAuth()->setAuthParams('album', null, 'view')->isValid() ) return;

if( 0 !== ($photo_id = (int) $this->_getParam('photo_id')) &&
null !== ($photo = Engine_Api::_()->getItem('album_photo', $photo_id)) )
{
Engine_Api::_()->core()->setSubject($photo);
}

else if( 0 !== ($album_id = (int) $this->_getParam('album_id')) &&
null !== ($album = Engine_Api::_()->getItem('album', $album_id)) )
{
Engine_Api::_()->core()->setSubject($album);
}
}

public function editAction()
{
if( !$this->_helper->requireUser()->isValid() ) return;
if( !$this->_helper->requireSubject('album')->isValid() ) return;
if( !$this->_helper->requireAuth()->setAuthParams(null, null, 'edit')->isValid() ) return;

init 関数のコードは、ページにアクセスするための要件を設定するだけで、editAction 関数内で認証データに対してチェックが実行されます。requireSubject および requireUser ヘルパーは非常に単純です。

  1. requireSubject は、上記の例では init 関数で行われるページの件名が設定されていることを期待しています
  2. requireUser は、閲覧者がログインしているユーザーであるかどうかを確認します

requireAuth ヘルパーは少し単純ではありません。簡潔にするために、抽象的な内部構造のほとんどを省略します。最後に、ヘルパーは Authorization_Api_Core::isAllowed 関数を指します: application/modules/Authorization/Core/Api.php

/**
* Gets the specified permission for the context
*
* @param Core_Model_Item_Abstract|string $resource The resource type or object that is being accessed
* @param Core_Model_Item_Abstract $role The item (user) performing the action
* @param string $action The name of the action being performed
* @return mixed 0/1 for allowed, or data for settings
*/
public function isAllowed($resource, $role, $action = 'view')

関数が期待する $resource および $role オブジェクトは、SocialEngine 内でモデルと呼ばれる Zend_Db_Table_Row のインスタンスであり、モジュールのモデル ディレクトリに配置されることが期待されます。isAllowed 関数が呼び出されると、認証 API はデータベースに対して engine4_authorization_allow、engine4_authorization_levels、および engine4_authorization_permissions テーブルに対してクエリを実行します。

  1. engine4_authorization_levels テーブルには、SocialEngine によってすぐに作成されるメンバー レベルと、管理パネルの [管理] > [メンバー レベル] セクションから作成されるカスタム メンバー レベルが含まれます。
  2. engine4_authorization_permissions テーブルには、メンバー レベルの設定など、デフォルトおよび管理者が指定した権限処理がすべて含まれています。
  3. engine4_authorization_allow には、個々のオブジェクトの許可データが含まれています。たとえば、フォト アルバムを表示できるユーザーに関する情報がそこに配置されます。engine4_authorization_allow.role_id (モデルのアイテム ID にマップ) が engine4_authorization_allow.resource_id (モデルのアイテム ID にマップ) にアクセスできるかどうかは、0 から 5 の数字を含む engine4_authorization_allow.value 列によって決まります。

アプリケーション/モジュール/承認/Api/Core.php

class Authorization_Api_Core extends Core_Api_Abstract
{
/**
* Constants
*/
const LEVEL_DISALLOW = 0;
const LEVEL_ALLOW = 1;
const LEVEL_MODERATE = 2;
const LEVEL_NONBOOLEAN = 3;
const LEVEL_IGNORE = 4;
const LEVEL_SERIALIZED = 5;

0) リンクされたリソースへのアクセスは許可されていません。これは許可テーブルに存在しない行と同じです

1)リンクされたリソースへのアクセスも許可されています

2) リソースへのアクセスとモデレートが許可されている (例: スーパー管理者、管理者、モデレーター メンバー レベル)

3-5) 許可されていないため、無視されます。これらは、承認を適切に処理するために、いくつかのカスタム ロジックを想定しています。

于 2012-08-31T18:29:30.983 に答える
1

SocialEngine にも詳しくありませんが、Zend Framework はよく使います。私はあなたにいくつかのヒントを提供しようとします. うまくいけば、他の誰かが必要に応じてあなたを埋めることができます.

SE は、先ほど示したコードの多くでZend_AuthZend_Aclを使用しているようです。

理解Zend_Authは役に立ちますが、その部分はすべて完了しており、やりたいことのほとんどを超えています。 Zend_Aclあなたがおそらく多くの時間を費やして読むものです。

と の違いを理解するための重要な概念Zend_Authは、ユーザーZend_AclZend_Auth認証することです。つまり、提供された資格情報をどこかのデータベースに対してチェックし、正しい ID を提供した (たとえば、ユーザー名とパスワードが一致した) ため、この人物が自分であると言います。 Zend_Acl一方、役割に基づいて特定のリソースへのアクセスを許可または拒否するために使用されます。

簡単に言えば、ユーザーに許可されていることとは何の 関係Zend_Authもありません。ユーザーが特定の機能または機能 (リソース) にアクセスできるかどうかを示します。Zend_Acl

私はこれを確認するために彼らのコードを見ていませんが、Engine_Api::_()->user()->getViewer()->getIdentity();一見するとデータベースからnullユーザーのどちらかのように見えるユーザーのIDを引き出しているようです。idこれを使用して、ユーザーがログインしているかどうかを確認できます。

次に、認証パラメーターを設定したり、ユーザーがアクセスできることを確認したりできるアクションヘルパーを呼び出しているようです。requireAuthこれは ZF 上に構築された Social Engine の一部であり、ZF 固有のものではないため、そのヘルパーの仕組みに関するドキュメントを読む必要がある場合があります。

Zend_Acl::isValid()このヘルパーは、ユーザーの役割が特定のリソースにアクセスできるかどうかを判断するため の間接的な呼び出し方法にすぎないと思います。Zend_Acl非常に簡単に動作します。それらへのアクセス試行にresources基づいて、特定へのアクセスを許可または拒否できます。roleデフォルトでは、特に許可されていない限り、すべてのリソースへのアクセスが拒否されます。

このプラグインがおそらく行うことは、いくつかの新しいリソースを作成し、おそらくpollユーザーができることview、またはedit特定のポーリングを制御することです。

を読むとZend_Acl、そのコードの詳細が明らかになるはずです。あとは、プラグインがロールとリソースをどのように格納するかを理解するだけです。これを Social Engine に保存する標準的な方法があり、特定のユーザーのリクエストごとに ACL ルールが自動的に設定されると思います。

それがいくつか役立つことを願っています。

于 2012-07-17T21:14:00.557 に答える