Форма входа Symfony 4 с пользователями безопасности и баз данных - PullRequest
0 голосов
/ 29 апреля 2018

Я был полным новичком в Symfony около недели назад, и я подумал, что должен просто погрузиться в Symfony 4. После недели попыток решить основную проблему входа в систему, я думаю, в документации все еще отсутствуют некоторые части.

Теперь я нашел решение и поделюсь им вместе с некоторыми советами о том, что вы, возможно, делаете неправильно. Первая часть ответа представляет собой список предложений, а вторая часть - создание проекта с рабочим логином с нуля (предположим, что у вас уже установлен composer и используется сервер, такой как apache).

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Большое спасибо, в документации отсутствуют некоторые важные вещи, но это работает очень хорошо. Для других проверьте порядок записей контроля доступа, потому что одна неуместная запись может блокировать весь процесс.

    access_control:
    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin, roles: ROLE_ADMIN }

Это работало, но это не

    access_control:
    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/admin, roles: ROLE_ADMIN }
    - { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
0 голосов
/ 29 апреля 2018

Часть 1: Предложения

403 Запрещено

Проверьте ключ access_control: в security.yaml. Порядок правил влияет, так как каждый раз будет соответствовать не более одного правила. Держите самые конкретные правила на вершине.

login_check

Убедитесь, что действие формы отправляет вас по пути login_check или к тому, на что вы изменили его в security.yaml .

Также убедитесь, что вы объявили маршрут для пути login_check либо в контроллере, либо в rout.yaml .

имя для ввода

Формы Symfony имеют тенденцию инкапсулировать входные имена в массиве, в то время как они ожидают, что они будут именоваться _username и _password (вы можете изменить это в security.yaml ), чтобы считать его попытка входа Поэтому проверьте входные данные, чтобы убедиться в правильности атрибутов имени.

Часть 2. Полный вход в Symfony 4

Настройка проекта

Начнем с создания проекта. Откройте cmd / терминал и перейдите в папку, в которую вы хотите поместить папку проекта.

cd .../MyProjects
composer create-project symfony/website-skeleton my-project
cd my-project

Теперь вы создали шаблон веб-сайта Symfony 4 в ... / MyProjects / my-project , и терминал cmd / находится по этому пути и будет правильно выполнять остальные команды.

Проверьте в папке ... / MyProjects / my-project / public файл .htaccess. Если он существует, у вас все в порядке, в противном случае выполните следующую команду.

composer require symfony/apache-pack

Теперь вы можете найти свой сайт, посетив my-project.dev / public . Если вы хотите удалить этот публичный путь, вы должны сделать это, используя файл .htaccess , не перемещая index.php .

Настройки проекта

1) Отредактируйте ключ DATABASE_URL внутри файла .env , чтобы он соответствовал настройкам вашей базы данных.

2) Отредактируйте файл config / packages / security.yaml , чтобы он выглядел следующим образом:

security:
    encoders:
        App\Entity\User:
            algorithm: bcrypt
    providers:
        user:
            entity:
                class: App\Entity\User
                property: username
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            anonymous: true
            provider: user
            form_login:
                #login_path: login
                #check_path: login_check
                default_target_path: homepage
                #username_parameter: _username
                #password_parameter: _password
            logout:
                #path:   /logout
                #target: /
    access_control:
        - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/,      roles: ROLE_USER }
        - { path: ^/admin, roles: ROLE_ADMIN }

Некоторое объяснение:

App\Entity\User - это пользовательская сущность, которую вы создадите для обработки логина.

Поставщик user - это просто имя, которое должно совпадать в поставщиках и брандмауэрах.

Клавиша logout должна быть объявлена, если вы хотите разрешить пользователю ... хорошо, выйти из системы.

Значения в #comment показывают значение по умолчанию, которое мы будем использовать позже, и служат ссылкой на то, что вы, скорее всего, измените.

User Entity

Пользователь должен иметь роль, но может иметь больше. Итак, давайте сначала создадим сущность UserRole для отношений ManyToMany.

php bin/console make:entity userRole

Все сущности начинаются со свойства id. Добавьте role тоже.

php bin/console make:entity user

Пользователю нужны свойства username, password и roles, но вы можете добавить больше.

Давайте отредактируем файл src / Entity / User.php :

Добавьте интерфейс UserInterface к классу User.

use Symfony\Component\Security\Core\User\UserInterface;
class User implements UserInterface

Редактировать сгенерированный getRoles(), чтобы он возвращал строковый массив.

public function getRoles(): array
{
    $roles = $this->roles->toArray();
    foreach($roles as $k => $v) {
        $roles[$k] = $v->getRole();
    }
    return $roles;
}

getSalt() и eraseCredentials() - функции для реализации интерфейса UserInterface.

public function getSalt()
{
    return null;
}
public function eraseCredentials()
{
}

Используя алгоритм bcrypt (как мы установили в security.yaml ), нам не нужна соль. Он генерирует автоматически один. Нет, вы нигде не храните эту соль, и да, каждый раз для одного и того же пароля будет создаваться разный хеш. Но да, это будет работать как-то (магия ...).

Если вам нужен другой алгоритм, использующий соль, вам нужно добавить свойство salt к сущности User.

Главная

В целях тестирования мы создадим домашнюю страницу

php bin/console make:controller homepage

Отредактируйте сгенерированный src / Controller / HomepageController.php файл, чтобы изменить корень на /

@Route("/", name="homepage")

Контроллер входа

php bin/console make:controller login

Отредактируйте сгенерированный файл src / Controller / LoginController.php , чтобы он выглядел следующим образом:

<?php

namespace App\Controller;

use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use App\Form\LoginType;

class LoginController extends Controller
{
    /**
     * @Route("/login", name="login")
     */
    public function index(AuthenticationUtils $authenticationUtils)
    {
        $error = $authenticationUtils->getLastAuthenticationError();
        $lastUsername = $authenticationUtils->getLastUsername();
        $form = $this->createForm(LoginType::class);
        return $this->render('login/index.html.twig', [
            'last_username' => $lastUsername,
            'error'         => $error,
            'form'          => $form->createView(),
        ]);
    }

    /**
     * @Route("/logout", name="logout")
     */
    public function logout() {}

    /**
     * @Route("/login_check", name="login_check")
     */
    public function login_check() {}
}

Форма входа

php bin/console make:form login

Вам не нужно связывать его с User сущностью.

Отредактируйте сгенерированный файл src / Form / LoginType.php , чтобы добавить его:

use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;

заменить это:

$builder
    ->add('_username')
    ->add('_password', PasswordType::class)
    ->add('login', SubmitType::class, ['label' => 'Login'])
;

и добавьте эту функцию, чтобы Symfony не мог изменить запрошенные выше входные имена, заключив их в login[...]

public function getBlockPrefix() {}

Шаблон входа

Отредактируйте файл templates / login / index.html.twig , чтобы добавить этот код в {% block body %} ... {% endblock %}:

{% if error %}
    <div>{{ error.messageKey|trans(error.messageData, 'security') }}</div>
{% endif %}
{{ form_start(form, {'action': path('login_check'), 'method': 'POST'}) }}
    {{ form_widget(form) }}
{{ form_end(form) }}

Создание базы данных

php bin/console doctrine:migrations:generate
php bin/console doctrine:migrations:migrate

Это должно было сгенерировать вашу базу данных в соответствии с вашими сущностями User и UserRole.

Создать пароль

Следующая команда предоставит вам хешированный пароль, который вы можете напрямую вставить в базу данных. Пароль будет хешироваться по алгоритму, указанному в security.yaml .

php bin/console security:encode-password my-password

Надеюсь, это поможет!

...