Wie jeder Service oder jede Methode in der Anwendung gesichert wird

Etwas aus dem Symfony2 Kochbuch.

Im Symfony Kapitel über die Sicherheit, kann man sehen wie ein Controller gesichert wird durch Anfragen des security.context Services vom Service-Container und das Prüfen der aktuellen Rolle des Benutzers.

// PHP Code
// ...
use Symfony\Component\Security\Core\Exception\AccessDeniedException;

public function helloAction($name)
{
    if (false === $this->get('security.context')->isGranted('ROLE_ADMIN')) {
        throw new AccessDeniedException();
    }

    // ...
}

Man kann auch jeden Service in ähnlicher Weise sichern durch injizieren des Services security.context. Eine allgemeine Einführung zum injizieren von Abhängigkeiten (engl. injecting dependencies) in Services gibt das Kapitel Service Container des Symfony Buches.

Mal angenommen, man hat eine Klasse NewsletterManager die E-Mails versendet. Die Benutzung der Klasse soll sich auf Benutzer einschränken, welche die Rolle ROLE_NEWSLETTER_ADMIN besitzen. Bevor die Sicherheitsbeschränkung hinzugefügt wird, sieht die Klasse in etwa so aus:

// src/Acme/HelloBundle/Newsletter/NewsletterManager.php
namespace Acme\HelloBundle\Newsletter;

class NewsletterManager
{

    public function sendNewsletter()
    {
        // ... where you actually do the work
    }

    // ...
}

Das Ziel ist es die Rolle des Benutzers zu überprüfen, wenn die sendNewsletter()-Methode aufgerufen wird. Der erste Schritt in diese Richtung ist den security.context Service in das Objekt zu injizieren. Da es nicht sinnvoll ist, den Sicherheits-Check nicht durchzuführen, ist dies ein idealer Kandidat für den Konstruktor, der garantiert dass das security context Objekt in der NewsletterManager-Klasse verfügbar sein wird:

namespace Acme\HelloBundle\Newsletter;
use Symfony\Component\Security\Core\SecurityContextInterface;

class NewsletterManager
{
    protected $securityContext;

    public function __construct(SecurityContextInterface $securityContext)
    {
        $this->securityContext = $securityContext;
    }

    // ...
}

In der Service Konfiguration kann der Service danach eingesetzt werden.

# src/Acme/HelloBundle/Resources/config/services.yml
parameters:
    newsletter_manager.class: Acme\HelloBundle\Newsletter\NewsletterManager

services:
    newsletter_manager:
        class:     "%newsletter_manager.class%"
        arguments: [@security.context]

Der eingefügte Service kann zur Ausführung des Sicherheitscheck benutzt werden, wenn die sendNewsletter()-Methode aufgerufen wird.

namespace Acme\HelloBundle\Newsletter;

use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\Security\Core\SecurityContextInterface;
// ...

class NewsletterManager
{
    protected $securityContext;

    public function __construct(SecurityContextInterface $securityContext)
    {
        $this->securityContext = $securityContext;
    }

    public function sendNewsletter()
    {
        if (false === $this->securityContext->isGranted('ROLE_NEWSLETTER_ADMIN')) {
            throw new AccessDeniedException();
        }

        // ...
    }

    // ...
}

Wenn der aktuelle Benutzer nicht die ROLE_NEWSLETTER_ADMIN Rolle besitzt, wird er aufgefordert sich anzumelden.

Das vollständige Symfony Kapitel hierzu und mit tiefergehenden Informationen liegt unter: http://symfony.com/doc/current/cookbook/security/securing_services.html
Abschnitte in dem Kapitel sind: Methoden sichern unter der Anwendung von Annotationen. Aktivieren der Annotations-Funktion für alle Services.

Advertisements

Kommentare

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s