2024.12.01 23:47:39
This commit is contained in:
parent
68d4bec756
commit
ff0ab7be47
@ -33,6 +33,12 @@ security:
|
|||||||
|
|
||||||
# https://symfony.com/doc/current/security/impersonating_user.html
|
# https://symfony.com/doc/current/security/impersonating_user.html
|
||||||
# switch_user: true
|
# switch_user: true
|
||||||
|
remember_me:
|
||||||
|
secret: '%kernel.secret%'
|
||||||
|
# three weeks lifetime (in seconds)
|
||||||
|
lifetime: 1814400
|
||||||
|
token_provider:
|
||||||
|
doctrine: true
|
||||||
|
|
||||||
# Easy way to control access for large sections of your site
|
# Easy way to control access for large sections of your site
|
||||||
# Note: Only the *first* access control that matches will be used
|
# Note: Only the *first* access control that matches will be used
|
||||||
|
|||||||
32
migrations/Version20241201211313.php
Normal file
32
migrations/Version20241201211313.php
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace DoctrineMigrations;
|
||||||
|
|
||||||
|
use Doctrine\DBAL\Schema\Schema;
|
||||||
|
use Doctrine\Migrations\AbstractMigration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Auto-generated Migration: Please modify to your needs!
|
||||||
|
*/
|
||||||
|
final class Version20241201211313 extends AbstractMigration
|
||||||
|
{
|
||||||
|
public function getDescription(): string
|
||||||
|
{
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function up(Schema $schema): void
|
||||||
|
{
|
||||||
|
// this up() migration is auto-generated, please modify it to your needs
|
||||||
|
$this->addSql('CREATE TABLE rememberme_token (series VARCHAR(88) NOT NULL, value VARCHAR(88) NOT NULL, lastUsed DATETIME NOT NULL --(DC2Type:datetime_immutable)
|
||||||
|
, class VARCHAR(100) NOT NULL, username VARCHAR(200) NOT NULL, PRIMARY KEY(series))');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(Schema $schema): void
|
||||||
|
{
|
||||||
|
// this down() migration is auto-generated, please modify it to your needs
|
||||||
|
$this->addSql('DROP TABLE rememberme_token');
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -7,7 +7,9 @@ use Symfony\Component\HttpFoundation\Response;
|
|||||||
use Symfony\Component\Routing\Attribute\Route;
|
use Symfony\Component\Routing\Attribute\Route;
|
||||||
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
|
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
|
||||||
|
|
||||||
class SecurityController extends AbstractController
|
use App\Controller\WebrootController;
|
||||||
|
|
||||||
|
class SecurityController extends WebrootController
|
||||||
{
|
{
|
||||||
#[Route(path: '/login', name: 'app_login')]
|
#[Route(path: '/login', name: 'app_login')]
|
||||||
public function login(AuthenticationUtils $authenticationUtils): Response
|
public function login(AuthenticationUtils $authenticationUtils): Response
|
||||||
@ -18,10 +20,16 @@ class SecurityController extends AbstractController
|
|||||||
// last username entered by the user
|
// last username entered by the user
|
||||||
$lastUsername = $authenticationUtils->getLastUsername();
|
$lastUsername = $authenticationUtils->getLastUsername();
|
||||||
|
|
||||||
return $this->render('security/login.html.twig', [
|
return $this->render('security/login.html.twig', array_merge(
|
||||||
'last_username' => $lastUsername,
|
$this->getControllerVariables(), [
|
||||||
'error' => $error,
|
'login_title' => $this->trans("login.title",domain:"security"),
|
||||||
]);
|
'login_button' => $this->trans("login.button",domain:"security"),
|
||||||
|
'login_username' => $this->trans("login.username",domain:"security"),
|
||||||
|
'login_password' => $this->trans("login.password",domain:"security"),
|
||||||
|
'login_remember_me' => $this->trans("login.remember_me",domain:"security"),
|
||||||
|
'last_username' => $lastUsername,
|
||||||
|
'error' => $error,
|
||||||
|
]));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[Route(path: '/logout', name: 'app_logout')]
|
#[Route(path: '/logout', name: 'app_logout')]
|
||||||
|
|||||||
@ -5,16 +5,23 @@ namespace App\Controller;
|
|||||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||||
use Symfony\Component\HttpFoundation\Response;
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
use Symfony\Component\Routing\Attribute\Route;
|
use Symfony\Component\Routing\Attribute\Route;
|
||||||
use \Symfony\Component\HttpKernel\KernelInterface;
|
use Symfony\Component\HttpKernel\KernelInterface;
|
||||||
|
use Symfony\Contracts\Translation\TranslatorInterface;
|
||||||
|
|
||||||
|
use App\Utility\NullTranslator;
|
||||||
|
|
||||||
abstract class WebrootController extends AbstractController
|
abstract class WebrootController extends AbstractController
|
||||||
{
|
{
|
||||||
private ?string $project_dir = null;
|
private ?string $project_dir = null;
|
||||||
|
private ?TranslatorInterface $tranlsator = null;
|
||||||
|
protected ?NullTranslator $nulltranslator = null;
|
||||||
|
|
||||||
public function __construct(KernelInterface $kernel)
|
|
||||||
|
public function __construct(KernelInterface $kernel,TranslatorInterface $translator)
|
||||||
{
|
{
|
||||||
$this->project_dir = $kernel->getProjectDir();
|
$this->project_dir = $kernel->getProjectDir();
|
||||||
|
$this->translator = $translator;
|
||||||
|
$this->nulltranslator = new NullTranslator();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getHeaderTitleFiglet(): ?string
|
public function getHeaderTitleFiglet(): ?string
|
||||||
@ -39,4 +46,9 @@ abstract class WebrootController extends AbstractController
|
|||||||
"header_title" => $this->getHeaderTitleFiglet(),
|
"header_title" => $this->getHeaderTitleFiglet(),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function trans(string $message,array $args=[],string $domain="messages",?string $locale=null): string
|
||||||
|
{
|
||||||
|
return $this->translator->trans($message,$args,domain:$domain,locale:$locale);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -21,7 +21,6 @@ __ _____| |__ _ __ ___ ___ | |_
|
|||||||
\ \ /\ / / _ \ '_ \| '__/ _ \ / _ \| __|
|
\ \ /\ / / _ \ '_ \| '__/ _ \ / _ \| __|
|
||||||
\ V V / __/ |_) | | | (_) | (_) | |_
|
\ V V / __/ |_) | | | (_) | (_) | |_
|
||||||
\_/\_/ \___|_.__/|_| \___/ \___/ \__|
|
\_/\_/ \___|_.__/|_| \___/ \___/ \__|
|
||||||
123
|
|
||||||
</pre></div>{% endif %}
|
</pre></div>{% endif %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
</header>
|
</header>
|
||||||
|
|||||||
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
{% block title %}Log in!{% endblock %}
|
{% block title %}Log in!{% endblock %}
|
||||||
|
|
||||||
{% block body %}
|
{% block main %}
|
||||||
<form method="post">
|
<form method="post">
|
||||||
{% if error %}
|
{% if error %}
|
||||||
<div class="alert alert-danger">{{ error.messageKey|trans(error.messageData, 'security') }}</div>
|
<div class="alert alert-danger">{{ error.messageKey|trans(error.messageData, 'security') }}</div>
|
||||||
@ -13,29 +13,37 @@
|
|||||||
You are logged in as {{ app.user.userIdentifier }}, <a href="{{ path('app_logout') }}">Logout</a>
|
You are logged in as {{ app.user.userIdentifier }}, <a href="{{ path('app_logout') }}">Logout</a>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<fieldset style="min-width: 400px;max-width: 650px;" class="center">
|
||||||
|
<legend><h3 class="h3 mb-3 font-weight-normal">{{ login_title }}</h3></legend>
|
||||||
|
<table class="full-width">
|
||||||
|
<tr>
|
||||||
|
<th class="shrink-to-fit standard-background left">
|
||||||
|
<label for="username">{{ login_username }}</label>
|
||||||
|
</th>
|
||||||
|
<td class="full-width left">
|
||||||
|
<input type="text" value="{{ last_username }}" name="_username" id="username" class="form-control full-width" autocomplete="username" required autofocus>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th class="shrink-to-fit standard-background left">
|
||||||
|
<label for="password">{{ login_password }}</label>
|
||||||
|
</th>
|
||||||
|
<td class="full-width left">
|
||||||
|
<input type="password" name="_password" id="password" class="form-control full-width" autocomplete="current-password" required>
|
||||||
|
</td>
|
||||||
|
<tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan="2" class="left">
|
||||||
|
<input type="checkbox" name="_remember_me" id="_remember_me">
|
||||||
|
<label for="_remember_me">{{ login_remember_me }}</label>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}">
|
||||||
|
|
||||||
<h1 class="h3 mb-3 font-weight-normal">Please sign in</h1>
|
<button class="btn btn-lg btn-primary" type="submit" class="right">{{ login_button }}</button>
|
||||||
<label for="username">Username</label>
|
</fieldset>
|
||||||
<input type="text" value="{{ last_username }}" name="_username" id="username" class="form-control" autocomplete="username" required autofocus>
|
|
||||||
<label for="password">Password</label>
|
|
||||||
<input type="password" name="_password" id="password" class="form-control" autocomplete="current-password" required>
|
|
||||||
|
|
||||||
<input type="hidden" name="_csrf_token"
|
|
||||||
value="{{ csrf_token('authenticate') }}"
|
|
||||||
>
|
|
||||||
|
|
||||||
{#
|
|
||||||
Uncomment this section and add a remember_me option below your firewall to activate remember me functionality.
|
|
||||||
See https://symfony.com/doc/current/security/remember_me.html
|
|
||||||
|
|
||||||
<div class="checkbox mb-3">
|
|
||||||
<input type="checkbox" name="_remember_me" id="_remember_me">
|
|
||||||
<label for="_remember_me">Remember me</label>
|
|
||||||
</div>
|
|
||||||
#}
|
|
||||||
|
|
||||||
<button class="btn btn-lg btn-primary" type="submit">
|
|
||||||
Sign in
|
|
||||||
</button>
|
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@ -17,3 +17,9 @@
|
|||||||
'Invalid or expired login link.': 'Ungültiger oder abgelaufener Anmelde-Link.'
|
'Invalid or expired login link.': 'Ungültiger oder abgelaufener Anmelde-Link.'
|
||||||
'Too many failed login attempts, please try again in %minutes% minute.': 'Zu viele fehlgeschlagene Anmeldeversuche, bitte versuchen Sie es in einer Minute noch einmal.'
|
'Too many failed login attempts, please try again in %minutes% minute.': 'Zu viele fehlgeschlagene Anmeldeversuche, bitte versuchen Sie es in einer Minute noch einmal.'
|
||||||
'Too many failed login attempts, please try again in %minutes% minutes.': 'Zu viele fehlgeschlagene Anmeldeversuche, bitte versuchen Sie es in %minutes% Minuten noch einmal.'
|
'Too many failed login attempts, please try again in %minutes% minutes.': 'Zu viele fehlgeschlagene Anmeldeversuche, bitte versuchen Sie es in %minutes% Minuten noch einmal.'
|
||||||
|
login:
|
||||||
|
title: "Bitte melde dich an"
|
||||||
|
button: "Anmelden"
|
||||||
|
username: "Nutzername"
|
||||||
|
password: "Passwort"
|
||||||
|
remember_me: "An mich erinnern"
|
||||||
|
|||||||
@ -17,3 +17,9 @@
|
|||||||
'Invalid or expired login link.': 'Invalid or expired login link.'
|
'Invalid or expired login link.': 'Invalid or expired login link.'
|
||||||
'Too many failed login attempts, please try again in %minutes% minute.': 'Too many failed login attempts, please try again in %minutes% minute.'
|
'Too many failed login attempts, please try again in %minutes% minute.': 'Too many failed login attempts, please try again in %minutes% minute.'
|
||||||
'Too many failed login attempts, please try again in %minutes% minutes.': 'Too many failed login attempts, please try again in %minutes% minutes.'
|
'Too many failed login attempts, please try again in %minutes% minutes.': 'Too many failed login attempts, please try again in %minutes% minutes.'
|
||||||
|
login:
|
||||||
|
title: "Please sign in"
|
||||||
|
button: "Log me in"
|
||||||
|
username: "Username"
|
||||||
|
password: "Password"
|
||||||
|
remember_me: "Remember me"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user