Часть 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
Надеюсь, это поможет!