Bonjour à tous !
J'ai vu plusieurs sujets qui traitent de ma question sur le net (et dans la doc') mais pourtant je n'arrive pas à le faire fonctionner et je ne comprends pas pourquoi.
Donc pour clarifier les choses, je souhaite créer mon propre user provider afin d'aller récupérer les membres via des requêtes SQL (je ne veux pas utiliser doctrine). Ainsi j'ai suivi la doc' et les conseils de plusieurs topics/articles, ce qui donne le code ci-dessous.
Le problème étant que je n'arrive pas à me connecter malgré tout. Lorsque j'essaie de me connecter avec les "comptes" inscrits en dur dans le security.yml (user/userpass par exemple), ça fonctionne. Mais lorsque j'essaie de passer par mon propre provider en mettant d'autres identifiants, il ne les reconnait pas me sort un simple "Bad credentials" comme erreur (ce n'est pas une erreur de symfony, juste une erreur retournée lorsque aucun utilisateur n'a été trouvé dans les providers).
Pour rendre les choses plus simples, je ne fais aucune requête dans mon provider, je renvois juste un membre fictif mon simuler une connexion réussie. Comme ça ne fonctionne pas, il me semble que symfony n'essaie même pas de passer par mon provider pour l'authentification, mais pourquoi...?
Merci par avance pour votre aide ! Je vous donne mon code ci-dessous.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 # app/config/security.yml security: 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' ] } webservice: id: webservice_user_provider firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false login: pattern: ^/login$ security: false secured_area: pattern: ^/ form_login: check_path: _security_check login_path: _login always_use_default_target_path: true default_target_path: subject_homepage logout: path: _logout target: subject_homepage anonymous: ~ access_control: - { path: ^/admin/, roles: ROLE_ADMIN } # - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY, requires_channel: https }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 # app/config/config.yml imports: - { resource: parameters.yml } - { resource: security.yml } - { resource: @SubjestWebserviceUserBundle/Resources/config/services.yml }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 # src/Subjest/WebserviceUserBundle/Resources/config/services.yml parameters: webservice_user_provider.class: Subjest\WebserviceUserBundle\Security\User\WebserviceUserProvider services: webservice_user_provider: class: "%webservice_user_provider.class%"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 <?php // src/Subjest/WebserviceUserBundle/Security/User/WebserviceUserProvider.php namespace Subjest\WebserviceUserBundle\Security\User; use Symfony\Component\Security\Core\User\UserProviderInterface; use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; use Symfony\Component\Security\Core\Exception\UnsupportedUserException; class WebserviceUserProvider implements UserProviderInterface { public function loadUserByUsername($username) { // Pour simplifier les choses, je renvoie un utilisateur directement return new WebserviceUser('toto', 'pass', NULL, array('ROLE_AUTHENTICATED')); } public function refreshUser(UserInterface $user) { if (!$user instanceof WebserviceUser) { throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user))); } return $this->loadUserByUsername($user->getUsername()); } public function supportsClass($class) { return $class === 'Subjest\WebserviceUserBundle\Security\User\WebserviceUser'; } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 <?php // src/Subjest/WebserviceUserBundle/Security/User/WebserviceUser.php namespace Subjest\WebserviceUserBundle\Security\User; use Symfony\Component\Security\Core\User\UserInterface; class WebserviceUser implements UserInterface { private $username; private $password; private $salt; private $roles; public function __construct($username, $password, $salt, array $roles) { $this->username = $username; $this->password = $password; $this->salt = $salt; $this->roles = $roles; } public function getRoles() { return $this->roles; } public function getPassword() { return $this->password; } public function getSalt() { return $this->salt; } public function getUsername() { return $this->username; } public function eraseCredentials() { } public function equals(UserInterface $user) { if (!$user instanceof WebserviceUser) { return false; } if ($this->password !== $user->getPassword()) { return false; } if ($this->getSalt() !== $user->getSalt()) { return false; } if ($this->username !== $user->getUsername()) { return false; } return true; } }
Encore une fois merci par avance !
Partager