Невозможное подключение к админ-панели с Symfony 4 / Security - PullRequest
0 голосов
/ 09 мая 2018

Я довольно новичок в 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,
        ));
    }
}

Надеюсь, я был достаточно конкретен, и вы поможете мне найти решение для этого. Большое спасибо!

...