Symfony2 + FOS с использованием аутентификатора simple_form

Я использую UserOffSymfony UserBundle . Он работает, когда я устанавливаю все в брандмауэре как form_login , но если я установил его в simple_form для использования Custom Authenticator, тогда он позволит мне войти, даже если учетная запись заблокирована или отключена. Я хочу проверить, исходит ли пользователь от правильного IP-адреса, поэтому я создал собственный аутентификатор, но, похоже, некоторая аутентификация, поступающая из FOS, не обрабатывается таким образом. Как я могу использовать simple_form с пользовательским аутентификатором, сохраняя при этом полную функциональность FOS UserBundle?

Есть ли другой способ, которым я могу добиться какой-либо другой аутентификации, чем только стандарт? Может быть, я делаю что-то не так? Я знаю, что могу исправить этот код моего аутентификатора, чтобы проверить заблокирован / включен и т. Д., Но я подумал – так как это уже сделано в FOS – почему я должен?

EDIT: Кроме того, я заметил, что когда я использую simple_form методы класса Symfony\Component\Security\Core\User\UserChecker не вызываются.

Ниже приведен мой код аутентификатора и security.yml :

config.yml

 services: login_authenticator: class: Forex\AlchemyBundle\Security\LoginAuthenticator arguments: ["@security.encoder_factory"] 

security.yml

 security: encoders: FOS\UserBundle\Model\UserInterface: sha512 role_hierarchy: ROLE_ADMIN: ROLE_USER ROLE_SUPER_ADMIN: ROLE_ADMIN providers: fos_userbundle: id: fos_user.user_provider.username_email firewalls: main: pattern: ^/ simple_form: authenticator: login_authenticator provider: fos_userbundle csrf_provider: form.csrf_provider logout: true anonymous: true access_control: - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY } # To be removed - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/admin/, role: ROLE_ADMIN } - { path: ^/.*, roles: ROLE_USER } 

LoginAuthenticator

 <?php namespace Forex\AlchemyBundle\Security; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Security\Core\Authentication\SimpleFormAuthenticatorInterface; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface; use Symfony\Component\Security\Core\Exception\AuthenticationException; use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; use Symfony\Component\Security\Core\User\UserProviderInterface; class LoginAuthenticator implements SimpleFormAuthenticatorInterface { private $encoderFactory; public function __construct(EncoderFactoryInterface $encoderFactory) { $this->encoderFactory = $encoderFactory; } public function authenticateToken(TokenInterface $token, UserProviderInterface $userProvider, $providerKey) { try { $user = $userProvider->loadUserByUsername($token->getUsername()); } catch (UsernameNotFoundException $e) { throw new AuthenticationException('Invalid username or password'); } $encoder = $this->encoderFactory->getEncoder($user); $passwordValid = $encoder->isPasswordValid( $user->getPassword(), $token->getCredentials(), $user->getSalt() ); if ($passwordValid) { $request = Request::createFromGlobals(); $current_ip = $request->server->get('REMOTE_ADDR'); $user->setLoggedIP($current_ip); if (!$user->isValidIP()) { throw new AuthenticationException( "You cannot login from your location.", 100 ); } return new UsernamePasswordToken( $user, $user->getPassword(), $providerKey, $user->getRoles() ); } else { // TODO: Check if there weren't too many tries to login } throw new AuthenticationException('Invalid username or password'); } public function supportsToken(TokenInterface $token, $providerKey) { return $token instanceof UsernamePasswordToken && $token->getProviderKey() === $providerKey; } public function createToken(Request $request, $username, $password, $providerKey) { return new UsernamePasswordToken($username, $password, $providerKey); } }