Я пытаюсь создать настраиваемое соединение, где я должен использовать веб-службу. Поэтому я прочитал учебник по адресу security и этот на custom provider. Теперь я пытаюсь создать свою собственную форму входа с тремя полями: адрес электронной почты, пароль и номер. После проверки я понял, что мой /login_check
передает в функции loadUserByUsername($username)
, но эта функция приняла аргумент только $username
и не берет поля и адрес электронной почты. Чтобы выполнить мой веб-сервис, мне нужно получить 3 аргумента. Как я могу настроить свою регистрационную форму?Пользовательское соединение Symfony2 через веб-службу
Цель: Когда пользователи отправляют форму для входа в систему, я хочу отправить веб-службу с помощью аргументов формы входа. Если я получу свой ответ без ошибок, я хочу подключить моего пользователя, загруженного веб-службой, к панели инструментов symfony2. Еще я хочу отобразить сообщение об ошибке.
Вы можете увидеть мой код здесь:
security.yml:
security:
encoders:
MonApp\MonBundle\Security\User\WebserviceUser: sha512
#Symfony\Component\Security\Core\User\User: plaintext
# http://symfony.com/doc/current/book/security.html#hierarchical-roles
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
# http://symfony.com/doc/current/book/security.html#where-do-users-come- from-user-providers
providers:
#in_memory:
#memory:
#users:
#ryan: { password: ryanpass, roles: 'ROLE_USER' }
#admin: { password: kitten, roles: 'ROLE_ADMIN' }
webservice:
id: webservice_user_provider
# the main part of the security, where you can set up firewalls
# for specific sections of your app
firewalls:
# disables authentication for assets and the profiler, adapt it according to your needs
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
area_secured:
pattern: ^/
anonymous: ~
form_login:
login_path: /login
check_path: /login_check
default_target_path: /test
logout:
path: /logout
target:/
# with these settings you can restrict or allow access for different parts
# of your application based on roles, ip, host or methods
access_control:
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, roles: ROLE_AUTHENTICATED }
WebserviceUser.php:
<?php
namespace MonApp\MonBundle\Security\User;
use Symfony\Component\Security\Core\User\UserInterface;
class WebserviceUser implements UserInterface
{
private $email;
private $password;
private $num;
private $salt;
private $roles;
public function __construct($email, $password, $num, $salt, array $roles)
{
$this->email = $email;
$this->password = $password;
$this->num = $num;
$this->salt = $salt;
$this->roles = $roles;
}
public function getUsername()
{
return '';
}
public function getEmail()
{
return $this->email;
}
public function getPassword()
{
return $this->password;
}
public function getNum()
{
return $this->num;
}
public function getSalt()
{
return $this->salt;
}
public function getRoles()
{
return $this->roles;
}
public function eraseCredentials()
{}
public function isEqualTo(UserInterface $user)
{
if (!$user instanceof WebserviceUser) {
return false;
}
if ($this->email !== $user->getEmail()) {
return false;
}
if ($this->password !== $user->getPassword()) {
return false;
}
if ($this->num !== $user->getNum()) {
return false;
}
if ($this->getSalt() !== $user->getSalt()) {
return false;
}
return true;
}
}
WebserviceUserProvider.php
<?php
namespace MonApp\MonBundle\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;
use MonApp\MonBundle\Security\User\WebserviceUser;
class WebserviceUserProvider implements UserProviderInterface
{
public function loadUserByUsername($username)
{
//print_r($username);
//die();
// effectuez un appel à votre service web ici
return new WebserviceUser('email', 'password', '45555', 'salt', array('ROLE_USER'));
//throw new UsernameNotFoundException(sprintf('Username "%s" does not exist.', $username));
}
public function refreshUser(UserInterface $user)
{
if (!$user instanceof WebserviceUser) {
throw new UnsupportedUserException(sprintf('Instances of "%s" are not supported.', get_class($user)));
}
print_r($user);
die();
return $this->loadUserByUsername($user->getUsername());
}
public function supportsClass($class)
{
return $class === 'MonApp\MonBundle\Security\User\WebserviceUser';
}
}
service.yml
parameters:
webservice_user_provider.class: MonApp\MonBundle\Security\User\WebserviceUserProvider
services:
webservice_user_provider:
class: "%webservice_user_provider.class%"
Я не буду размещать весь код, но мое действие, шаблон и маршрутизация входа в систему точно совпадают, чем ссылка безопасности. Но мой пользователь new WebserviceUser('email', 'password', '45555', 'salt', array('ROLE_USER'))
не подключен к панели инструментов. Поэтому я думаю, что я что-то забыл ...
Нужно ли мне использовать Listener, UserToken и Factory для этого?
Вы используете брандмауэр Anonymous, возможно, вам должен создать класс «WebServiceFirewall» со своей собственной фабрикой. – Med
Спасибо, Med, у вас есть ссылка, где я могу реализовать собственный брандмауэр? Я положил 'anonymous: ~', потому что увидел это в поваренной книге, в руководстве по безопасности. – Remi
Если вы все еще застряли в сообщении здесь, я помогу вам http://symfony.com/fr/doc/current/cookbook/security/custom_authentication_provider.html – Med