web-dev-qa-db-ja.com

フロントエンドコンポーネントへのアクセスを制限する

私はJoomlaコンポーネントを開発しており、管理者がフロントエンドの特定のビューへのアクセスを制限するオプションを持つことを望んでいます。

このビューのメニューアイテムを作成し、メニューからアクセスすると、ユーザーログインページが表示されます。すべて良い。

ただし、完全なURL(index.php?option=com_mycomponent&view=myRestrictedView)を入力すると、そのビューに直接移動できます

残りのアクセス許可に対して現在のユーザーオブジェクトを確認するために、コントローラーにいくつかのコードを配置する必要があることに気付きましたが、どこから始めればよいかわかりません。 「MVCコンポーネントの開発」チュートリアルを見てきましたが、それはバックエンドに焦点を当てています。

[〜#〜] tldr [〜#〜]-ユーザーがこのビューに対して承認されているかどうかを確認するためにcontroller.phpに必要な承認コードと、どこに「設定」できるかこの認証レベル(config.xmlフィールドタイプaccesslevel?)

最も簡単な方法は、私のconfig.xmlaccesslevelフィールドとJUser::getAuthorisedViewLevelsへの呼び出しだと思いますが、少しハッキーに思えます...

5
codinghands

最初に開始する場所はJoomlaです。Joomlaがそれを行う場合は、コードを読んでどのように実装されているかを確認できます。現在のACLモデルは、2.5ライン(1.6)の最初に導入されました。

Joomlaは、そのACL機能を「表示」と「実行」に分解します。あなたが尋ねているのはviewingです。

com_contentでは、ArticleビューがビュークラスファイルContentViewArticleのビューアクセスを次の基準でチェックすることがわかります。

    // Check the view access to the article (the model has already computed the values).
    if ($item->params->get('access-view') == false && ($item->params->get('show_noauth', '0') == '0'))
    {
        JError::raiseWarning(403, JText::_('JERROR_ALERTNOAUTHOR'));
        return;
    }

モデルはすでに値を計算している」というコメントに気付くでしょう。この場合、モデルは/components/com_content/models/article.phpにあるContentModelArticleです。 getItem()メソッドの終わりに近づくと:

// Compute view access permissions.
if ($access = $this->getState('filter.access'))
{
    // If the access filter has been set, we already know this user can view.
    $data->params->set('access-view', true);
}
else
{
    // If no access filter is set, the layout takes some responsibility for display of limited information.
    $user = JFactory::getUser();
    $groups = $user->getAuthorisedViewLevels();

    if ($data->catid == 0 || $data->category_access === null)
    {
        $data->params->set('access-view', in_array($data->access, $groups));
    }
    else
    {
        $data->params->set('access-view', in_array($data->access, $groups) && in_array($data->category_access, $groups));
    }
}

もちろん、拡張機能によっては、JoomlaのACLに加えて、チェックする必要がある他の要件がある場合があります。ユーザーが「やっていること」を制御したいという非常に合理的な期待もあります。

ACLのより良いアイデアを得るための推奨される読み方は、おそらく "Access Control List" および "J25:Access Control List Tutorial"JoomlaのDocのWebサイト

7
Craig

@Craigの回答は非常に優れていますが、JERRORはJoomla 4.0で廃止される予定です。 UIに通知する場合は、代わりに以下のコードを使用できます。

\Joomla\CMS\Factory::getApplication()->enqueueMessage($msg, 'warning')

2

私は http://component-creator.com/ を使用します。フロントエンドビューのACLは、生成されたすべてのコンポーネントに組み込まれています。

0
Andrés Maeso