Hallo an alle, ich habe da mal eine Frage zum Security-Layer von FLOW3 :p
Ich habe eine einfache Konfiguration mit geschützem Bereich, Login, einem User und einer Rolle "Administrator" eingerichtet. In der DB-Tabelle "typo3_flow3_security_account" ist der angelegte User gespeichert und hat dort auch die Rolle "Administrator". Das Login (mittels TYPO3\FLOW3\Authentication) funktioniert und der User wird erfolgreich authentifiziert. Auch das "csrfToken" wird automatisch an die URl angehängt.
Wenn ich allerdings auf den geschützten Bereich zugreifen will bekomme ich die Meldung "Access denied!".
Fehlermeldung in Security_Development.log: ###############################
12-08-08 14:46:04 5711 127.0.0.1 INFO FLOW3 Successfully re-authenticated tokens for account "wusel"
12-08-08 14:46:04 5711 127.0.0.1 INFO FLOW3 Access denied (0 denied, 0 granted, 1 abstained) to method Acme\Artikel\Controller\ArtikelController::__construct().
Policy.yaml: ############################################################
resources:
methods:
RestrictedArea: 'class(Acme\Artikel\Controller\.*)'
roles:
Administrator: []
acls:
Administrator:
methods:
RestrictedArea: GRANT
Settings.yaml: ###########################################################
TYPO3:
FLOW3:
security:
enable: true
authentication:
providers:
DefaultProvider:
provider: PersistedUsernamePasswordProvider
entryPoint: 'WebRedirect'
entryPointOptions:
uri: 'login/'
User-Account wurde wie folgt erzeugt: ##################################
$identifier = 'wusel';
$password = 'geheim';
$roles = array('Administrator');
$authenticationProviderName = 'DefaultProvider';
$account = $this->accountFactory->createAccountWithPassword($identifier, $password, $roles, $authenticationProviderName);
$this->accountRepository->add($account);
Beim Test im Fluid-Template mit folgendem Code wird "You are NOT an Administrator" ausgegeben:
<f:security.ifHasRole role="Administrator">
<f:then>
You are an Administrator
</f:then>
<f:else>
You are NOT an Administrator
</f:else>
</f:security.ifHasRole>
Es scheint so, dass der User sich zwar anmelden kann, er dann aber keine Administrator-Rechte hat.
Warum nur? Wie verhelfe ich den User zu seinen Administrator-Rechten?
#angry#
PS:
Mir ist klar, dass ich hier nicht den vollständigen Quellcode angegeben habe. Falls was fehlt bzw. unklar ist liefere ich gerne noch was nach.
Ich habs jetzt gerade nicht im AOP nachgeschaut aber ich vermute, dass das Problem ist das Deine Resourcedefinition alle Methoden im Controller catched und das im constructor ein Problem ist. Du solltest das auf die Actions beschränken das sollte auch in den Beispielen so sein... Ich vermute das reicht schon.
Kitsunet schrieb
Ich habs jetzt gerade nicht im AOP nachgeschaut aber ich vermute, dass das Problem ist das Deine Resourcedefinition alle Methoden im Controller catched und das im constructor ein Problem ist. Du solltest das auf die Actions beschränken das sollte auch in den Beispielen so sein... Ich vermute das reicht schon.
Danke für die schnelle Hilfe Kitsunet.
Ich habe bei den Resourcedefinitionen schon so einiges ausprobiert, da ich auch erst fest davon überzeugt war, es müsste daran liegen.
Aber egal welche Definition der folgenden Definitionen ich verwende (die Klasse ArtikelController komplett sperren oder nur die edit-Action), ich komme als angemeldeter User nicht in den jeweils geschützten Bereich.
Policy.yaml: ############################################################
resources:
methods:
RestrictedArea: 'class(Acme\Artikel\Controller\ArtikelController)'
#RestrictedArea: 'method(Acme\Artikel\Controller\ArtikelController->editAction())'
roles:
Administrator: []
acls:
Administrator:
methods:
RestrictedArea: GRANT
Es scheint eben leider so, als ob der angemeldete User keine Administrator-Rolle hat. Ich habe das jetzt mal genauer wissen wollen mittels folgendem Code in einem nicht geschützten Bereich (LoginController-IndexAction):
class LoginController extends ActionController {
/**
* @FLOW3\Inject
* @var \TYPO3\FLOW3\Security\Context
*/
protected $securityContext;
/**
*
*
* @return string
*/
public function indexAction() {
$roles = $this->securityContext->getRoles();
foreach ($roles as $role) {
\TYPO3\FLOW3\var_dump($role->__toString());
}
}
}
Ohne Login wird folgendes ausgegeben:
FLOW3 Variable Dump
'Everybody' (9)
FLOW3 Variable Dump
'Anonymous' (9)
Nach Login erscheint folgende Ausgabe:
FLOW3 Variable Dump
'Everybody' (9)
Schön, nach dem Login hat der User also nicht mehr die Rolle "Anonymous". Aber warum hat er keine Rolle "Administrator"? Ich denke ich mache irgendetwas ganz banales falsch. Nur was?
Fall gelöst - Täter: YAML
Nein, lag an meiner eigenen Dummheit. Die YAML-Daten in Policy.yaml müssen nur richtig strukturiert werden und schon funktioniert alles wie gewünscht. "resources", "roles" und "acls" müssen auf der gleichen Ebene liegen (nicht eingerückt):
Policy.yaml: ############################################################
resources:
methods:
RestrictedArea: 'class(Acme\Artikel\Controller\ArtikelController)'
#RestrictedArea: 'method(Acme\Artikel\Controller\ArtikelController->editAction())'
roles:
Administrator: []
acls:
Administrator:
methods:
RestrictedArea: GRANT
Puh, was ne Aufregung für nichts. Sorry 😉