カスタムコンポーネントビューへのアクセスを制限する方法


11

カスタムコンポーネントで、特定のビューを特定のユーザーグループのみに制限できるようにしたいと考えています。ビューの1つにメニュー項目を作成する場合、それは非常に簡単です。そのメニュー項目のアクセスレベルを選択するだけで完了です。

ここで、option = com_mycomponentを使用してURLに直接アクセスしようとした場合、または私のコンポーネントの内部リダイレクトのいずれかがItemidが割り当てられていないページに移動した場合に問題が発生します...その場合、必要なのはコンポーネント自体です。ユーザーグループをチェックして、そのページを表示できるかどうかを判断する...コードでそれを制限するにはどうすればよいですか?ユーザーのユーザーグループの単純なハードコードされたチェック?それとも、「標準的な」方法がありますか?

私はドキュメントをチェックしていて、これを見つけました:

http://docs.joomla.org/J2.5:How_to_implement_actions_in_your_code

しかし、それはユーザーができることのためであり、ユーザーが見ることができるもののためではありません。私はこのフォーラムのスレッドも見つけました:

http://forum.joomla.org/viewtopic.php?t=530721

最初のコードはかなり古いですが、最後にこれを使用することをお勧めします:

http://api.joomla.org/cms-3/classes/JUser.html#method_authorise

そのためにはどうすればよいですか?JUserでアクセスをテストできるように、ビューで生成されたメインオブジェクトのアセットを定義する必要がありますか?

前もって感謝します。

回答:


9

コンポーネントにコントロールを送信する前に、カスタムコンポーネントへのすべてのリクエストを処理するシステムプラグインを作成できます。

すべてのアクセスチェックを実行するには、onAfterRouteイベントを使用します。

function onAfterRoute()
{
  $user = JFactory::getUser();
  $groups = $user->groups;

  $jinput = JFactory::getApplication()->input;
  $option = $jinput->get('option', '');
  $view   = $jinput->get('view', '');

  // place USER-GROUP related checking here
}

うーん...興味深いアプローチ。きれいに聞こえ、すべてのロジックを特定の場所に配置します。これは、コンポーネントで直接実行するよりもパフォーマンスの点で少し「悪い」と思いますが、おそらく無関係な余分なミリ秒ですよね?
Isidro Baquero 2014年

比較的比較して言うと...まだこのミリ秒のパフォーマンスヒットはコンポーネントの全体的なパフォーマンスに大きな影響を与えることはなく、これらすべてのトリガーを使用することを意図したものです:)そして、コンポーネント自体にコードを追加して作成するポイントは何ですか?混乱
ニック

4

これは、ユーザーがどのグループに属しているかを確認する方法を示すために開始する必要があるコードです。

$user = JFactory::getUser();
$groups = $user->groups;
if($user->id) {
    echo $user->username.' is logged in<Br/>';
    if (isset($groups[8])) echo " - User is a Super User <Br/>";
    if (isset($groups[7])) echo " - User is an Administrator <Br/>";
    if (isset($groups[6])) echo " - User is an Manager <Br/>";
}else{
    echo 'Not logged in<Br/>';
}

GDPに感謝します。この部分は多かれ少なかれ管理されていました。だから私はそれを行うための「正しい方法」がすべてのビューでそれを使うことを理解していますか?
Isidro Baquero 2014年

すべてのビューを制限したくない場合を除いて、いくつかのコンポーネントパラメータ、またはすべてのビューに使用されるヘルパー関数を設定する必要がある場合を除き、必要があります。
GDP

興味深い...コンポーネントパラメータを介してビューを制限することについて調査し続けるにはどこに行くことができますか?再度、感謝します!
Isidro Baquero 2014年

Joomla ACLについても学習したいようですが、Googleに調査を提案するか、component-creator.comでコンポーネントを試してみて、すべてがどのように機能するかを確認することができます。生成されたコードには、$ canCreate、$ canEdit、$ canCheckinなどの変数の設定が含まれています。ACLに慣れたら、$ canViewなどの独自のACLルールを設定できます。すべての提案-それはプログラミングであり、あなたはそれを千の異なる方法で行うことができます。
GDP

笑!はいはい。わかりました、ありがとう。学ぶことが多すぎる...
Isidro Baquero 2014年

4

おそらくこの質問への遅い答え。しかし、これが私が使用したものです:

メインのcontroller.phpファイルで、display関数を次のようにオーバーライドしました。

public function display($cachable = false, $urlparams = array())
{
        $user = JFactory::getUser();
        $app  = JFactory::getApplication();

        $view = $this->input->get('view');

        if ($view == 'someview' || $view == 'anotherview')
        {
            if ($user->get('guest') == 1)
            {
                $uri = JUri::getInstance();
                $this->setRedirect(
                        JRoute::_('index.php?option=com_users&view=login&return=' . base64_encode($uri->toString())), $app->enqueueMessage(JText::_('COM_YOURCOMPONENT_LOGIN_REQUIRED'), 'warning')
                );

                return;
            }
         }

        parent::display($cachable, $urlparams);
 }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.