Backend Rolle welche nur Zugriff auf den Medien Browser hat

Hallo zusammen,

ich versuche grade eine Backend-Rolle zu entwickeln, welche nur Zugriff auf den Medien Browser hat. Hier sollen nur ein Upload bzw. Löschen von Dokumente statt finden.

Ich habe bisher meine Policy.yaml folgendermaßen angepasst:

roles:
  'Tobi:MediaEditor':
    privileges:
      - privilegeTarget: 'Neos.Neos:Backend.GeneralAccess'
        permission: GRANT
      - privilegeTarget: 'Neos.Neos.Ui:Backend.GeneralAccess'
        permission: GRANT
      - privilegeTarget: 'Neos.Neos:Backend.PersonalWorkspaceReadAccess.NodeConverter'
        permission: GRANT
      - privilegeTarget: 'Neos.Media.Browser:ManageAssets'
        permission: GRANT
      - privilegeTarget: 'Neos.Neos:Backend.Module.Management'
        permission: GRANT

Damit kann ich mich im Backend einloggen und sehe das leuchtende Neos-Logo. Den Medien Browser kann ich auch über die URL /neos/management/media erreichen.

Nun zur eigentlichen Frage: Kann man nach dem erfolgreichen Login der Rolle Tobi:MediaEditor ein redirect auf /neos/management/media machen? Das soll auch nur für die Rolle gelten.

Gruß Mathias

Hi Mathias,

das geht in Neos 7 mit preferredStartModules, siehe https://neos.readthedocs.io/en/7.0/Appendixes/ReleaseNotes/700.html#configurable-default-backend-module

In älteren Versionen muss man vermutlich in den Loginprozess eingreifen und redirecten.
Da weiß @daniellienert ggf. mehr glaube ich.

Grüße

Hi Mathias,

wir haben das in älteren Neos-Versionen auch schon mal mit AOP gemacht.
Da greifen wir einfach in den Redirect nach Login ein, checken die Rollen und bauen alternativ den Link zum anderen Modul.

Mehr zu AOP in Flow: https://flowframework.readthedocs.io/en/stable/TheDefinitiveGuide/PartIII/AspectOrientedProgramming.html
Hier das Beispiel aus unserem Projekt:

<?php

namespace KaufmannDigital\Site\Aop;

use KaufmannDigital\Site\Controller\DownloadableResourceController;
use Neos\Flow\Annotations as Flow;
use Neos\Flow\Aop\JoinPoint;
use Neos\Flow\Mvc\ActionRequest;
use Neos\Flow\Mvc\Routing\UriBuilder;
use Neos\Flow\Security\Authorization\PrivilegeManagerInterface;
use Neos\Flow\Security\Context;
use Neos\Neos\Domain\Repository\UserRepository;

/**
 * An aspect implementing security for Foo
 *
 * @Flow\Aspect
 */
class AfterLoginRedirectAspect
{

    /**
     * @Flow\Inject
     * @var PrivilegeManagerInterface
     */
    protected $privilegeManager;



    /**
     * @Flow\Around("method(Neos\Neos\Service\BackendRedirectionService->getAfterLoginRedirectionUri())")
     * @param JoinPoint $joinPoint
     */
    public function adadad(JoinPoint $joinPoint)
    {
        if($this->privilegeManager->isPrivilegeTargetGranted('Neos.Neos:Backend.Module.Content') === false && $this->privilegeManager->isPrivilegeTargetGranted('KaufmannDigital.Site:DownloadableResourcesManager') === true) {

            /** @var ActionRequest $actionRequest */
            $actionRequest = $joinPoint->getMethodArgument('actionRequest');
            $uriBuilder = new UriBuilder();
            $uriBuilder->setRequest($actionRequest);
            $uriBuilder->setFormat('html');
            $uriBuilder->setCreateAbsoluteUri(true);

            return $uriBuilder->reset()->uriFor('index', ['module' => 'management/downloadableResources'], 'Backend\Module', 'Neos.Neos');
        }

        return $joinPoint->getAdviceChain()->proceed($joinPoint);
    }
}
1 Like

Vielen Dank für eure Antworten.

Ich werde mir das mit AOP mal anschauen, da ich die Seite noch nicht auf NEOS7 updaten möchte. Das update ist erst zum Sommer geplant.
Ich werde berichten ob es mir geglückt ist, und wie die Lösung aussieht. Ich bin da optimistisch.

Viele Grüße Mathias

Hallo,

ich wollte nur zurückmelden das das mit AOP sehr gut funktioniert hat. Vielen Dank für den Tipp.
Meine Lösung sieht folgendermaßen aus:

<?php
namespace  de\tobisoftware\site\igvev\AOP;

use Neos\Flow\Annotations as Flow;
use Neos\Flow\Aop\JoinPoint;
use Neos\Flow\Mvc\ActionRequest;
use Neos\Flow\Mvc\Routing\UriBuilder;
use Neos\Flow\Security\Authorization\PrivilegeManagerInterface;
use Neos\Flow\Security\Context;
use Neos\Neos\Domain\Repository\UserRepository;

/**
 * An aspect implementing security for Foo
 *
 * @Flow\Aspect
 */
class LoginRedirectAOP {

    /**
     * @Flow\Inject
     * @var PrivilegeManagerInterface
     */
    protected $privilegeManager;

    /**
     * @Flow\Around("method(Neos\Neos\Service\BackendRedirectionService->getAfterLoginRedirectionUri())")
     * @param JoinPoint $joinPoint
     */
    public function redirectToMedia(JoinPoint $joinPoint)
    {
        if($this->privilegeManager->isPrivilegeTargetGranted('Neos.Neos:Backend.Module.Content') === false && $this->privilegeManager->isPrivilegeTargetGranted('Neos.Media.Browser:ManageAssets') === true) {

            /** @var ActionRequest $actionRequest */
            $actionRequest = $joinPoint->getMethodArgument('actionRequest');
            $uriBuilder = new UriBuilder();
            $uriBuilder->setRequest($actionRequest);
            $uriBuilder->setFormat('html');
            $uriBuilder->setCreateAbsoluteUri(true);

            return $uriBuilder->reset()->uriFor('index', ['module' => 'management/media'], 'Backend\\Module');
        }

        return $joinPoint->getAdviceChain()->proceed($joinPoint);
    }
}

VG Mathias

1 Like

Das freut mich zu hören :slight_smile: Schön, dass die Lösung auch für dich funktioniert!