security.context and IS_AUTHENTICATED_ANONYMOUSLY
Bonjour à tous,
contexte;
J'ai créé gillesBundle et ai renommé ma route par default testRole.
j'ai ensuite configuré mon app/security.php qui pointe sur SecurityController -> SecurityView pour le rendu.
Le but est de pouvoir accéder sur la page testRole quelque soi les droits anonyme ou user etc...
mais par contre avec des conditions différentes.
si anonymous condition 1 si user condition2 etc...
hors si je met la dite page en anonymous:true afin que mes utilisateurs non connecté puisse voir la page, je ne peux mettre une condition si connecté en temps que user puisque non protégé par le firewall.
de plus connecté ou anonymous ça passe puisque user est plus élevé que anonymous.
et si je protège ma page par le firewall j'ai donc mes roles respectif mais là du coup je suis redirigé sur ma page login.
donc à quoi peut il bien servire ce role IS_AUTHENTICATED_ANONYMOUSLY?
mes codes:
app/security.php
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
security:
encoders:
Symfony\Component\Security\Core\User\User: plaintext
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
in_memory:
memory:
users:
user: { password: userpass, roles: [ 'ROLE_USER' ] }
admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main_login:
pattern: ^/login$
anonymous: true # On autorise alors les anonymes sur ce pare-feu
main:
pattern: ^/
anonymous: false
provider: in_memory
form_login:
login_path: login
check_path: login_check
logout:
path: logout
target: /testRole
access_control:
- { path: ^/testRole, roles: IS_AUTHENTICATED_ANONYMOUSLY } |
app/routing
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
app/routing
resource: "@gillesBundle/Resources/config/routing.yml"
prefix: /
login:
pattern: /login
defaults: { _controller: gillesBundle:Security:login }
login_check:
pattern: /login_check
logout:
pattern: /logout |
SecurityController
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
<?php
// src/OC/UserBundle/Controller/SecurityController.php;
namespace gillesBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\SecurityContext;
class SecurityController extends Controller
{
public function loginAction(Request $request)
{
if ($this->get('security.context')->isGranted('IS_AUTHENTICATED_REMEMBERED')) {
return $this->redirectToRoute('gilles_homepage');
}
$authenticationUtils = $this->get('security.authentication_utils');
return $this->render('gillesBundle:Security:login.html.twig', array(
'last_username' => $authenticationUtils->getLastUsername(),
'error' => $authenticationUtils->getLastAuthenticationError(),
));
}
} |
login:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
{# src/OC/UserBundle/Resources/views/Security/login.html.twig #}
{% extends "::base.html.twig" %}
{% block body %}
{# S'il y a une erreur, on l'affiche dans un joli cadre #}
{% if error %}
<div class="alert alert-danger">{{ error.message }}</div>
{% endif %}
{# Le formulaire, avec URL de soumission vers la route « login_check » comme on l'a vu #}
<form action="{{ path('login_check') }}" method="post">
<label for="username">Login :</label>
<input type="text" id="username" name="_username" value="{{ last_username }}" />
<label for="password">Mot de passe :</label>
<input type="password" id="password" name="_password" />
<br />
<input type="submit" value="Connexion" />
</form>
{% endblock %} |
routing
Code:
1 2 3 4
|
gilles_homepage:
path: /testRole
defaults: { _controller: gillesBundle:Default:index } |
security
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
<?php
namespace gillesBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class DefaultController extends Controller
{
public function indexAction()
{
if (!$this->get('security.context')->isGranted('IS_AUTHENTICATED_ANONYMOUSLY')) {
echo "pas connecté";
// return $this->redirectToRoute('login');
// echo "<pre>".print_r($this->get('security.context')->getToken(),true)."/<pre>";
}
if($this->get("security.context")->isGranted('ROLE_USER')){
echo "connecté";
}
return $this->render('gillesBundle:Default:index.html.twig');
}
} |
view
Code:
1 2 3 4 5 6 7 8 9
|
{% extends "::base.html.twig" %}
{% block body %}
{% if is_granted("IS_AUTHENTICATED_ANONYMOUSLY") %}
anonymous
{% endif %}
{% endblock %} |
je suis dans l'impasse car si anonymous pas de roles même connecté et authentifié car pas protégé et si protégé pas d' anonymous possible car redirigé vers la page login.
Bien à vous
ps: j'ai trouvé cela
IS_AUTHENTICATED_ANONYMOUSLY - automatically assigned to a user who is in a firewall protected part of the site but who has not actually logged in. This is only possible if anonymous access has been allowed.
Automatiquement attribué à un utilisateur qui se trouve dans une partie protégée par un pare-feu du site mais qui n'a pas encore ouvert de session. Cela n'est possible que si l'accès anonyme a été autorisé.
derière un firewall non authentifié c'est ce que je cherche bon sans alors pour suis je redirigé sur login si pas connecté accesscontrol me donne rien.