Wie kann ich den Zugriff auf benutzerdefinierte Komponentenansichten einschränken?

11

In meiner benutzerdefinierten Komponente möchte ich bestimmte Ansichten nur auf bestimmte Benutzergruppen beschränken können. Wenn ich einen Menüpunkt für eine meiner Ansichten erstelle, ist das ziemlich einfach: Ich wähle einfach die Zugriffsebene für diesen Menüpunkt aus und bin fertig.

Das Problem tritt nun auf, wenn jemand versucht, direkt auf eine URL mit der Option = com_mycomponent zuzugreifen, oder eine der internen Umleitungen meiner Komponente zu einer Seite ohne zugewiesene Itemid wechselt. In diesem Fall ist es die Komponente selbst, die benötigt wird um die Benutzergruppe zu überprüfen und festzustellen, ob diese Seite angezeigt werden kann ... wie kann ich das in meinem Code einschränken? Nur eine einfache fest codierte Überprüfung der Benutzergruppe des Benutzers? Oder gibt es einen "Standard" Weg dafür?

Ich habe die Dokumentation überprüft und Folgendes festgestellt:

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

Aber das ist für das, was der Benutzer tun kann, nicht für das, was der Benutzer sehen kann. Ich habe auch diesen Forenthread gefunden:

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

Der Code am Anfang ist ziemlich alt, aber am Ende wird empfohlen, Folgendes zu verwenden:

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

Wie soll ich dafür vorgehen? Sollte ich Assets für das von meiner Ansicht generierte Hauptobjekt definieren, damit ich den Zugriff mit JUser darauf testen kann?

Danke im Voraus.

Isidro Baquero
quelle

Antworten:

9

Sie können ein System-Plugin erstellen, um alle Anforderungen an Ihre benutzerdefinierte Komponente zu verarbeiten, bevor Sie die Steuerung an die Komponente senden.

Verwenden Sie das Ereignis onAfterRoute , um die gesamte Zugriffsprüfung durchzuführen.

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
}
Nick
quelle
Hmmm ... interessanter Ansatz. Klingt sauberer und Sie würden die gesamte Logik an einem bestimmten Ort platzieren. Ich denke, dies wird in Bezug auf die Leistung etwas "schlechter" sein als direkt in der Komponente, aber wahrscheinlich nur eine irrelevante zusätzliche Millisekunde, oder?
Isidro Baquero
Nun, vergleichsweise kann man sagen, dass ... dieser Millisekunden-Performance-Hit immer noch keinen großen Einfluss auf die Gesamtleistung der Komponente hat und schließlich alle diese Trigger verwendet werden sollen :) und was bringt es, zusätzlichen Code in die Komponente selbst einzufügen und zu erstellen Verwirrung
Nick
4

Hier ist der Code, den Sie benötigen, um zu zeigen, in welchen Gruppen sich ein Benutzer befindet.

$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/>';
}
BIP
quelle
Danke BIP. Dieser Teil war mehr oder weniger unter Kontrolle. Ich verstehe also, dass der "richtige Weg" darin besteht, dies in jeder Ansicht zu verwenden?
Isidro Baquero
Sie müssten, sofern Sie nicht alle Ansichten einschränken möchten, in diesem Fall einige Komponentenparameter oder eine Hilfsfunktion einrichten, die für jede Ansicht verwendet wird.
BIP
Interessant ... wo kann ich weiter nachforschen, um Ansichten über Komponentenparameter einzuschränken? Danke noch einmal!
Isidro Baquero
Es hört sich so an, als ob Sie wahrscheinlich auch etwas über die Joomla-ACL erfahren möchten, aber ich kann Google nur für Forschungszwecke vorschlagen oder eine Komponente unter component-creator.com ausprobieren und sehen, wie alles funktioniert. Der generierte Code enthält das Setzen von Variablen wie $ canCreate, $ canEdit und $ canCheckin. Sobald Sie mit ACL WIRKLICH vertraut sind, können Sie Ihre eigene ACL-Regel wie $ canView festlegen. Alles nur Vorschläge - es ist Programmierung, Sie können es auf tausend verschiedene Arten tun.
BIP
LOL! OK OK. Verstanden, danke. Zu viel zu lernen ...
Isidro Baquero
4

Wahrscheinlich die späte Antwort auf diese Frage. Aber hier ist was ich verwendet habe:

In der Hauptdatei controller.php habe ich die Anzeigefunktion wie folgt überschrieben:

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);
 }
Sahil Purav
quelle