Consultant Web
@joelwurtz
Associe un domaine (RequestMatcher) à un système de sécurité (FirewallContext)
Regarde si la requète courante est valide
# -*- mode: php -*-
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RequestMatcherInterface;
class MyRequestMatcher implements RequestMatcherInterface
{
public function matches(Request $request)
{
//Renvoie vrai si on doit lancer notre système de sécurite, faux dans le cas inverse
return ($request->getHost() == "admin.monapplication.com");
}
}
Comment déclencher l'authentification ?
Executer lors d'une exception de type AuthenticationException
# -*- mode: php -*-
throw new AuthenticationException();
ExceptionListener contient un EntryPoint
# -*- mode: php -*-
namespace Symfony\Component\Security\Http\EntryPoint;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\HttpFoundation\Request;
interface AuthenticationEntryPointInterface
{
public function start(Request $request, AuthenticationException $authException = null);
}
# -*- mode: php -*-
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
interface ListenerInterface
{
public function handle(GetResponseEvent $event);
}
Un listener traite un Token non-authentifié
Contient les informations relatives à l'authentication et l'autorisation : Utilisateur, Droits, ...
Un Token possède 2 états
Autre rôles :
Provenance des utilisateurs
# -*- mode: php -*-
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Core\User\UserInterface;
class UserProvider implements UserProviderInterface
{
public function loadUserByUsername($username)
{
}
public function refreshUser(UserInterface $user)
{
}
public function supportsClass($class)
{
}
}
Déconnecte l'utilisateur
Authentifies les utilisateurs
Appel des AuthenticationProvider avec un Token
Créer un token "authentifié" avec le token "non-authentifié"
Exemple : DaoAuthenticationProvider
Créer un Token non authentifié
Vérifie les droits de l'utilisateur avec le requète
Permet de se connecter à la place d'un autre utilisateur
Il existes 2 types de Factory :
# -*- mode: php -*-
class MyUserFactory implements UserProviderFactoryInterface
{
public function getKey()
{
//La clé de notre configuration dans un provider
"my_configuration_key";
}
public function addConfiguration(NodeDefinition $builder)
{
//Ici on définit l'architecture de notre configuration (comme un bundle)
$node
->children()
->scalarNode('my_parameter')->cannotBeEmpty()->end()
->end()
;
}
public function create(ContainerBuilder $container, $id, $config)
{
//Ici on créer notre service selon la configuration
$definition = $container->setDefinition($id, new DefinitionDecorator('my_bundle.security.user.provider.my_awesome_provider'));
}
}
# -*- mode: php -*-
class MySecurityFactory implements SecurityFactoryInterface
{
public function create(ContainerBuilder $container, $id, $config, $userProvider, $defaultEntryPoint)
{
//Fonction qui doit renvoyer nos 3 services
return array($myAuthenticationProviderId, $myAuthenticationListenerId, $myEntryPointId);
}
public function getPosition()
{
//Position d'appel de notre authentification listener et user provider (pre_auth, form, http et remember_me)
return "form";
}
public function getKey()
{
return "my_config_key";
}
public function addConfiguration(NodeDefinition $node)
{
$node
->children()
->scalarNode('my_parameter')->cannotBeEmpty()->end()
->end()
;
}
}
# -*- mode: php -*-
class MyBundle extends Bundle
{
public function build(ContainerBuilder $container)
{
parent::build($container);
$extension = $container->getExtension('security');
$extension->addUserProviderFactory(new MyUserFactory());
$extension->addSecurityListenerFactory(new MySecurityFactory());
}
}
@joelwurtz
@jolicode
http://jolicode.github.com/SecurityBundle-avec-de-l-aspirine