Schritt 1: Symfony-Projekt erstellen
Öffnen Sie die Konsole und führen Sie den folgenden Befehl aus, um ein neues Symfony-Projekt mit dem Namen „my_project“ zu erstellen:symfony new my_project --full
Dies erstellt ein neues Symfony-Projekt mit allen erforderlichen Abhängigkeiten.
Schritt 2: Datenbank konfigurieren
Öffnen Sie die Datei .env und konfigurieren Sie Ihre Datenbank-Verbindung. Beispiel:
DATABASE_URL=mysql://username:password@127.0.0.1:3306/my_database
Dies konfiguriert eine Verbindung zu einer MySQL-Datenbank mit dem Benutzernamen „username“, dem Passwort „password“ und der Datenbank „my_database“.
Schritt 3: Benutzerentität erstellen
Erstellen Sie eine neue Entität namens User mit dem folgenden Befehl:bin/console make:user
Dies erstellt eine neue Datei src/Entity/User.php mit der grundlegenden Benutzerentitätsstruktur.
Schritt 4: Datenbankmigrationen ausführen
Führen Sie den folgenden Befehl aus, um die Datenbankmigrationen zu erstellen und die Datenbank zu aktualisieren:Dies erstellt die Tabellen für die Benutzerentität in der Datenbank.bin/console make:migration
bin/console doctrine:migrations:migrate
Schritt 5: SecurityController erstellen
Erstellen Sie einen neuen Controller namens SecurityController. Öffnen Sie nun die Datei src/Controller/SecurityController.php und fügen Sie die folgenden Methoden hinzu:
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class SecurityController extends AbstractController
{
/**
* @Route("/login", name="app_login")
*/
public function login(AuthenticationUtils $authenticationUtils): Response
{
// 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', ['last_username' => $lastUsername, 'error' => $error]);
}
/**
* @Route("/logout", name="app_logout")
*/
public function logout(): void
{
throw new \Exception('This should never be reached!');
}
}
Die erste Methode login() zeigt das Login-Formular an und gibt Fehlermeldungen zurück, wenn das Login fehlschlägt. Die zweite Methode logout() wird aufgerufen, wenn der Benutzer sich abmeldet.
Schritt 6: Login-Template erstellen
Als nächstes müssen Sie ein Template für das Login-Formular erstellen. Erstellen Sie eine neue Datei templates/security/login.html.twig und fügen Sie den folgenden Code hinzu:
{% extends 'base.html.twig' %}
{% block body %}
<h2>Login</h2>
{% if error %}
<div class="alert alert-danger">{{ error.messageKey|trans(error.messageData, 'security') }}</div>
{% endif %}
<form method="post">
<div class="form-group">
<label for="username">Benutzername:</label>
<input type="text" id="username" name="_username" value="{{ last_username }}" class="form-control" required="" autofocus="">
</div>
<div class="form-group">
<label for="password">Passwort:</label>
<input type="password" id="password" name="_password" class="form-control" required="">
</div>
<button type="submit" class="btn btn-primary">Anmelden</button>
</form>
{% endblock %}
Dieses Template enthält das HTML-Formular für den Benutzer, um sich anzumelden.
Schritt 7: Security-Konfiguration einrichten
Öffnen Sie die Datei config/packages/security.yaml und fügen Sie die folgende Konfiguration hinzu:
security:
encoders:
App\Entity\User:
algorithm: auto
providers:
our_db_provider:
entity:
class: App\Entity\User
property: username
firewalls:
main:
anonymous: true
provider: our_db_provider
form_login:
login_path: app_login
check_path: app_login
logout:
path: app_logout
target: /
access_control:
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
Diese Konfiguration definiert die Sicherheitseinstellungen für die Anwendung. Sie konfiguriert den Encoder für die Benutzerentität, den Datenbank-Provider und die Firewall, die das Login-Formular verwendet. Sie definiert auch den Zugriffskontrollpfad für nicht authentifizierte Benutzer.
Schritt 8: Benutzer erstellen
Erstellen Sie einen Benutzer, indem Sie den folgenden Befehl ausführen:bin/console make:user
Dies erstellt eine neue Benutzerentität. Bearbeiten Sie nun die Datei src/Entity/User.php und fügen Sie die folgenden Eigenschaften hinzu:
/**
* @ORM\Column(type="string", length=180, unique=true)
*/
private $username;
/**
* @ORM\Column(type="json")
*/
private $roles = [];
/**
* @ORM\Column(type="string")
*/
private $password;
Dies definiert die Eigenschaften für den Benutzernamen, die Rollen und das Passwort.
Schritt 9: Benutzer in der Datenbank speichern
Speichern Sie den Benutzer in der Datenbank, indem Sie den folgenden Befehl ausführen:bin/console doctrine:fixtures:load
Dies erstellt einen Benutzer mit dem Benutzernamen „admin“ und dem Passwort „password“. Sie können diese Werte nach Belieben ändern.
Schritt 10: Fertigstellen
Sie haben nun eine voll funktionsfähige Anmeldung in Ihrer Symfony-Anwendung implementiert. Sie können nun das Login-Formular aufrufen, sich anmelden und auf geschützte Ressourcen zugreifen. Das waren die grundlegenden Schritte zur Implementierung eines Login-Systems mit Symfony. Sie können diese Schritte anpassen und erweitern, um Ihre spezifischen Anforderungen zu erfüllen. Wenn Sie weitere Informationen benötigen, empfehle ich Ihnen, die offizielle Symfony-Dokumentation zu konsultieren.Vollständiger Quellcode
Hier finden Sie den vollständigen Quellcode für diese Anleitung: src/Controller/SecurityController.php:
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
class SecurityController extends AbstractController
{
public function login(AuthenticationUtils $authenticationUtils)
{
$error = $authenticationUtils->getLastAuthenticationError();
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render('security/login.html.twig', [
'last_username' => $lastUsername,
'error' => $error,
]);
}
public function logout()
{
// Controller kann leer bleiben, wird automatisch vom Security-System behandelt.
}
}
templates/security/login.html.twig:
{% extends 'base.html.twig' %}
{% block body %}
<h2>Login</h2>
{% if error %}
<div class="alert alert-danger">{{ error.messageKey|trans(error.messageData, 'security') }}</div>
{% endif %}
<form method="post">
<div class="form-group">
<label for="username">Benutzername:</label>
<input type="text" id="username" name="_username" value="{{ last_username }}" class="form-control" required="" autofocus="">
</div>
<div class="form-group">
<label for="password">Passwort:</label>
<input type="password" id="password" name="_password" class="form-control" required="">
</div>
<button type="submit" class="btn btn-primary">Anmelden</button>
</form>
{% endblock %}
config/packages/security.yaml:
security:
encoders:
App\Entity\User:
algorithm: auto
providers:
our_db_provider:
entity:
class: App\Entity\User
property: username
firewalls:
main:
anonymous: true
provider: our_db_provider
form_login:
login_path: app_login
check_path: app_login
logout:
path: app_logout
target: /
access_control:
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
src/Entity/User.php:
namespace App\Entity;
use Symfony\Component\Security\Core\User\UserInterface;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
*/
class User implements UserInterface
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=180, unique=true)
*/
private $username;
/**
* @ORM\Column(type="json")
*/
private $roles = [];
/**
* @ORM\Column(type="string")
*/
private $password;
public function getId(): ?int
{
return $this->id;
}
public function getUsername(): ?string
{
return $this->username;
}
public function setUsername(string $username): self
{
$this->username = $username;
return $this;
}
public function getRoles(): array
{
$roles = $this->roles;
// Jeder Benutzer muss mindestens die ROLE_USER Rolle haben
$roles[] = 'ROLE_USER';
return array_unique($roles);
}
public function setRoles(array $roles): self
{
$this->roles = $roles;
return $this;
}
public function getPassword(): ?string
{
return $this->password;
}
public function setPassword(string $password): self
{
$this->password = $password;
return $this;
}
public function getSalt()
{
// Das Salt wird automatisch von der PasswordEncoder-Klasse generiert.
// Sie können es ignorieren, wenn Sie die Standardkonfiguration verwenden.
}
public function eraseCredentials()
{
// Das Löschen der Anmeldedaten ist nicht notwendig, da sie automatisch gelöscht werden.
}
}
Ich hoffe, dass diese Anleitung hilfreich war und Ihnen einen Eindruck davon vermitteln konnte, wie man eine sichere Anmeldung in einer Symfony-Anwendung implementiert. Wenn Sie Fragen haben oder Hilfe benötigen, zögern Sie nicht, die offizielle Symfony-Dokumentation zu konsultieren oder sich an die Symfony-Community zu wenden.