Я довольно новичок в Symfony 4, и это в основном первый раз, когда я использую что-то для обработки соединения с панелью администратора или файл yaml для установки параметров. Как рекомендуется в документации, я использую рецепт безопасности. Поскольку весь сайт работал на моем компьютере, я развернул его онлайн, где возникла проблема с подключением.
Итак, вот моя проблема:
Я создал пользователя при разработке сайта с именем пользователя: пароль и пароль. Я использовал argon2i как рекомендовано. При переключении в производственный режим на удаленном сервере я просто сбросил базу данных и скопировал ее на сервер. Страница входа не перенаправляла на панель администратора.
Я думал, что это может быть потому, что алгоритм argon2 генерирует соленую базу на ресурсах ОС или что-то в этом роде. Поэтому я восстановил пароль для пользователя. Connexion все еще не работал. Я попытался с другим алгоритмом (изменение пароля непосредственно в базе данных каждый раз).
Я думал, что рабочий режим не может быть установлен для разных ролей, поэтому я уменьшил роли настроек безопасности до IS_AUTHENTICATED_FULLY
Я пытался воссоздать те же настройки в рабочем режиме и в режиме разработки на моем компьютере, и теперь он больше не работает.
Сначала я подумал, что это из-за конфигурации сервера, но, очевидно, это не так, как я пытался использовать сервер Apache, сервер PHP, предоставляемый по рецепту сервера, и сервер PHP raw. Поскольку я получаю HTTP-код 401 для всех серверов, я думаю, что это связано с тем, что Symfony сравнивает хешированный пароль в базе данных с незашифрованным паролем, введенным пользователем. Я могу ошибаться, но это, кажется, наиболее вероятная проблема.
Я также понятия не имею, как это исправить. Я попытался с формой, автоматически сгенерированной (где я не знаю, как поместить некоторую логику, когда форма действительна и отправлена), я попытался с всплывающей «старой школой», так что я думал, что конфигурация безопасности справится с этим …
Вот мой код:
config/packages/security.yaml
security:
# https://symfony.com/doc/current/security.html#where-do-users-come-from-user-providers
providers:
db_provider:
entity:
class: App\Entity\User
property: username
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
logout:
path: /logout
target: /
prod:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
logout:
path: /logout
target: /
main:
anonymous: ~
http_basic: ~
provider: db_provider
# form_login:
# login_path: login
# check_path: login
# default_target_path: projects_index
# always_use_default_target_path: true
# remember_me:
# secret: '%kernel.secret%'
# lifetime: 604800 # 1 week in seconds
# path: /
# always_remember_me: true
logout:
path: /logout
target: /
pattern: ^/admin
encoders:
Symfony\Component\Security\Core\User\User: plaintext
App\Entity\User:
algorithm: sha512
# 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, roles: IS_AUTHENTICATED_FULLY }
# - { path: ^/user, roles: ROLE_ADMIN }
session_fixation_strategy: migrate
hide_user_not_found: true
always_authenticate_before_granting: false
erase_credentials: true
access_decision_manager:
strategy: affirmative # One of affirmative, consensus, unanimous
allow_if_all_abstain: false
allow_if_equal_granted_denied: true
src/Controller/SecurityController.php
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class SecurityController extends Controller
{
/**
* @Route("/login", name="login")
*/
public function login(Request $request, AuthenticationUtils $authenticationUtils, UserPasswordE$
{
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('security/login.html.twig', array(
'last_username' => $lastUsername,
'error' => $error,
));
}
}
src/Form/UserType.php
use App\Entity\User;
use Doctrine\DBAL\Types\TextType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class UserType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('username')
->add('alias')
->add('plainPassword', RepeatedType::class, array(
'type' => PasswordType::class,
'first_options' => array('label' => 'Password'),
'second_options' => array('label' => 'Repeat Password'),
))
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => User::class,
));
}
}
Я надеюсь, что я был достаточно конкретен, и вы поможете мне найти решение для этого. Большое спасибо !
Задача ещё не решена.
Других решений пока нет …