Я хочу внедрить форму входа через Symfony / Security в мое приложение.Я все настроил, но он все еще не работает должным образом.
Это мой security.yaml :
security:
providers:
sablon_users:
entity:
class: App\Entity\User
property: email
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
admin_login:
anonymous: true
pattern: ^/admin/auth
form_login:
login_path: security_login
check_path: security_login
csrf_token_generator: security.csrf.token_manager
default_target_path: /admin
admin:
pattern: ^/admin
guard:
authenticators:
- App\Security\LoginAuthenticator
provider: sablon_users
logout:
path: admin_logout
target: security_login
main:
pattern: ^/
anonymous: true
# activate different ways to authenticate
# http_basic: true
# https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
# form_login: true
# https://symfony.com/doc/current/security/form_login_setup.html
# Easy way to control access for large sections of your site
# Note: Only the *first* access control that matches will be used
access_control:
- { path: ^/admin/auth/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin, roles: IS_AUTHENTICATED_FULLY }
encoders:
App\Entity\User:
algorithm: bcrypt
cost: 12
мой rout.yaml :
admin_logout:
path: /admin/auth/logout
admin:
type: annotation
resource: ../src/Controller/Admin
prefix: /admin
site:
type: annotation
resource: ../src/Controller/Site
LoginAuthenticator.php :
class LoginAuthenticator extends AbstractFormLoginAuthenticator
{
/**
* @var EntityManagerInterface
*/
private $em;
/**
* @var RouterInterface
*/
private $router;
/**
* @var UserPasswordEncoderInterface
*/
private $encoder;
/**
* @var CsrfTokenManagerInterface
*/
private $csrfTokenManager;
/**
* @var TokenStorageInterface
*/
private $tokenStorage;
/**
* LoginAuthenticator constructor.
*
* @param EntityManagerInterface $em
* @param CsrfTokenManagerInterface $csrfTokenManager
* @param RouterInterface $router
* @param TokenStorageInterface $tokenStorage
* @param UserPasswordEncoderInterface $encoder
*/
public function __construct(
EntityManagerInterface $em,
CsrfTokenManagerInterface $csrfTokenManager,
RouterInterface $router,
TokenStorageInterface $tokenStorage,
UserPasswordEncoderInterface $encoder
)
{
$this->em = $em;
$this->csrfTokenManager = $csrfTokenManager;
$this->router = $router;
$this->tokenStorage = $tokenStorage;
$this->encoder = $encoder;
}
/**
* @param Request $request
* @return bool
*/
/**
* @return mixed
*/
public function getCurrentUser()
{
$token = $this->tokenStorage->getToken();
return $token->getUser();
}
/**
* Does the authenticator support the given Request?
*
* If this returns false, the authenticator will be skipped.
*
* @param Request $request
*
* @return bool
*/
public function supports(Request $request)
{
$isLoginSubmitRequest = $request->getPathInfo() === 'admin/auth/login' && $request->isMethod('POST');
if(!$isLoginSubmitRequest){
return false;
}
return true;
}
/**
* @param Request $request
*
* @return mixed Any non-null value
*
* @throws \UnexpectedValueException If null is returned
*/
public function getCredentials(Request $request)
{
$credentials = [
'email' => $request->request->get('email'),
'password' => $request->request->get('password'),
'csrf_token' => $request->request->get('_csrf_token'),
];
$request->getSession()->set(
Security::LAST_USERNAME,
$credentials['email']
);
return $credentials;
}
/**
* @param mixed $credentials
* @param UserProviderInterface $userProvider
* @return User|null|object|UserInterface
*/
public function getUser($credentials, UserProviderInterface $userProvider)
{
$token = new CsrfToken('authenticate', $credentials['csrf_token']);
if (!$this->csrfTokenManager->isTokenValid($token)) {
throw new InvalidCsrfTokenException();
}
$user = $this->em->getRepository(User::class)->findOneBy(['email' => $credentials['email']]);
if (!$user) {
// fail authentication with a custom error
throw new Exception('Email could not be found.');
}
return $user;
}
/**
* @param mixed $credentials
* @param UserInterface $user
*
* @return bool
*
* @throws AuthenticationException
*/
public function checkCredentials($credentials, UserInterface $user)
{
$password = $credentials['password'];
return $this->encoder->isPasswordValid($user,$password);
}
/**
*
* @param Request $request
* @param AuthenticationException $exception
*
* @return Response|null
*/
public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
{
$request->getSession()->set(Security::AUTHENTICATION_ERROR, $exception);
return new RedirectResponse($this->router->generate('security_login'));
}
/**
* @param Request $request
* @param TokenInterface $token
* @param string $providerKey The provider (i.e. firewall) key
*
* @return Response|null
*/
public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
{
return new RedirectResponse($this->router->generate('app_homepage'));
}
/**
* @return bool
*/
public function supportsRememberMe()
{
return false;
}
/**
* Return the URL to the login page.
*
* @return string
*/
protected function getLoginUrl()
{
return $this->router->generate('security_login');
}
Когда я пытаюсь войти с правильными учетными данными.Он загружает пользователя и даже показывает имя пользователя в _profiler как аутентифицированное (класс токена: UsernamePasswordToken).Он показывает соответствующие роли для пользователя.
Однако, когда я пытаюсь перейти в область '/ admin', он перенаправляет меня на страницу входа.Он не отображает никаких ошибок на странице или консоли.
Мой dev.log показывает поток, хотя:
- [2019-02-13 13:58:01] запрос.ИНФОРМАЦИЯ: Соответствующий маршрут "app_homepage".{ "Маршрут": "app_homepage", "route_parameters": { "_ контроллер": "Symfony \ Bundle \ FrameworkBundle \ Controller \ RedirectController :: urlRedirectAction", "путь": "/ администратор /", "постоянный": правда,»схема ": ноль," httpPort ": 8000," httpsPort ": 443," _ route ":" app_homepage "}," request_uri ":" http://localhost:8000/admin","method":"GET"} [] [2019-02-13 13:58:01] security.DEBUG: проверка учетных данных для аутентификации защиты. {"firewall_key": "admin", "authenticators": 1} []
- [2019-02-13 13:58:01] security.DEBUG:Проверка поддержки на охранном аутентификаторе. {"Firewall_key": "admin", "authenticator": "App \ Security \ LoginAuthenticator"} []
- [2019-02-13 13:58:01] security.DEBUG: Guard authenticator не поддерживает запрос. {"Firewall_key": "admin", "authenticator": "App \ Security \ LoginAuthenticator"} []
- [2019-02-13 13:58:01]security.INFO: было сгенерировано исключение AuthenticationException; перенаправление на точку входа аутентификации. {"исключение": "[объект] (Symfony \ Component \ Security \ Core \ Exception \ AuthenticationCredentialsNotFoundException (код:0): токен не найден в TokenStorage.по адресу /home/vagrant/Code/project_name/vendor/symfony/security-http/Firewall/AccessListener.php:51) "} []
- [2019-02-13 13:58:01] security.DEBUG: вызов точки входа для аутентификации. [] []