added Section entity
This commit is contained in:
parent
e7de1931fc
commit
aeaaae7bf5
|
@ -0,0 +1,75 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Entity;
|
||||||
|
|
||||||
|
use App\Repository\SectionRepository;
|
||||||
|
use Doctrine\ORM\Mapping as ORM;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ORM\Entity(repositoryClass=SectionRepository::class)
|
||||||
|
*/
|
||||||
|
class Section
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @ORM\Id
|
||||||
|
* @ORM\GeneratedValue
|
||||||
|
* @ORM\Column(type="integer")
|
||||||
|
*/
|
||||||
|
private $id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ORM\Column(type="string", length=255)
|
||||||
|
*/
|
||||||
|
private $title;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ORM\Column(type="string", length=255, nullable=true)
|
||||||
|
*/
|
||||||
|
private $description;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ORM\Column(type="string", length=255, nullable=true)
|
||||||
|
*/
|
||||||
|
private $teaserImage;
|
||||||
|
|
||||||
|
public function getId(): ?int
|
||||||
|
{
|
||||||
|
return $this->id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTitle(): ?string
|
||||||
|
{
|
||||||
|
return $this->title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setTitle(string $title): self
|
||||||
|
{
|
||||||
|
$this->title = $title;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getDescription(): ?string
|
||||||
|
{
|
||||||
|
return $this->description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setDescription(?string $description): self
|
||||||
|
{
|
||||||
|
$this->description = $description;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTeaserImage(): ?string
|
||||||
|
{
|
||||||
|
return $this->teaserImage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setTeaserImage(?string $teaserImage): self
|
||||||
|
{
|
||||||
|
$this->teaserImage = $teaserImage;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,50 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Repository;
|
||||||
|
|
||||||
|
use App\Entity\Section;
|
||||||
|
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
||||||
|
use Doctrine\Persistence\ManagerRegistry;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @method Section|null find($id, $lockMode = null, $lockVersion = null)
|
||||||
|
* @method Section|null findOneBy(array $criteria, array $orderBy = null)
|
||||||
|
* @method Section[] findAll()
|
||||||
|
* @method Section[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
|
||||||
|
*/
|
||||||
|
class SectionRepository extends ServiceEntityRepository
|
||||||
|
{
|
||||||
|
public function __construct(ManagerRegistry $registry)
|
||||||
|
{
|
||||||
|
parent::__construct($registry, Section::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
// /**
|
||||||
|
// * @return Section[] Returns an array of Section objects
|
||||||
|
// */
|
||||||
|
/*
|
||||||
|
public function findByExampleField($value)
|
||||||
|
{
|
||||||
|
return $this->createQueryBuilder('s')
|
||||||
|
->andWhere('s.exampleField = :val')
|
||||||
|
->setParameter('val', $value)
|
||||||
|
->orderBy('s.id', 'ASC')
|
||||||
|
->setMaxResults(10)
|
||||||
|
->getQuery()
|
||||||
|
->getResult()
|
||||||
|
;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
public function findOneBySomeField($value): ?Section
|
||||||
|
{
|
||||||
|
return $this->createQueryBuilder('s')
|
||||||
|
->andWhere('s.exampleField = :val')
|
||||||
|
->setParameter('val', $value)
|
||||||
|
->getQuery()
|
||||||
|
->getOneOrNullResult()
|
||||||
|
;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
|
@ -4,6 +4,7 @@ namespace App\Security;
|
||||||
|
|
||||||
use App\Entity\User;
|
use App\Entity\User;
|
||||||
use Doctrine\ORM\EntityManagerInterface;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
|
use JetBrains\PhpStorm\ArrayShape;
|
||||||
use Symfony\Component\HttpFoundation\RedirectResponse;
|
use Symfony\Component\HttpFoundation\RedirectResponse;
|
||||||
use Symfony\Component\HttpFoundation\Request;
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
|
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
|
||||||
|
@ -22,85 +23,189 @@ use Symfony\Component\Security\Http\Util\TargetPathTrait;
|
||||||
|
|
||||||
class AppAuthenticator extends AbstractFormLoginAuthenticator implements PasswordAuthenticatedInterface
|
class AppAuthenticator extends AbstractFormLoginAuthenticator implements PasswordAuthenticatedInterface
|
||||||
{
|
{
|
||||||
use TargetPathTrait;
|
use TargetPathTrait;
|
||||||
|
|
||||||
public const LOGIN_ROUTE = 'app_login';
|
public const LOGIN_ROUTE = 'app_login';
|
||||||
|
|
||||||
private $entityManager;
|
private $entityManager;
|
||||||
private $urlGenerator;
|
private $urlGenerator;
|
||||||
private $csrfTokenManager;
|
private $csrfTokenManager;
|
||||||
private $passwordEncoder;
|
private $passwordEncoder;
|
||||||
|
|
||||||
public function __construct(EntityManagerInterface $entityManager, UrlGeneratorInterface $urlGenerator, CsrfTokenManagerInterface $csrfTokenManager, UserPasswordEncoderInterface $passwordEncoder)
|
public function __construct(EntityManagerInterface $entityManager, UrlGeneratorInterface $urlGenerator, CsrfTokenManagerInterface $csrfTokenManager, UserPasswordEncoderInterface $passwordEncoder)
|
||||||
{
|
{
|
||||||
$this->entityManager = $entityManager;
|
$this->entityManager = $entityManager;
|
||||||
$this->urlGenerator = $urlGenerator;
|
$this->urlGenerator = $urlGenerator;
|
||||||
$this->csrfTokenManager = $csrfTokenManager;
|
$this->csrfTokenManager = $csrfTokenManager;
|
||||||
$this->passwordEncoder = $passwordEncoder;
|
$this->passwordEncoder = $passwordEncoder;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function supports(Request $request)
|
/**
|
||||||
{
|
* Does the authenticator support the given Request?
|
||||||
return self::LOGIN_ROUTE === $request->attributes->get('_route')
|
*
|
||||||
&& $request->isMethod('POST');
|
* If this returns false, the authenticator will be skipped.
|
||||||
}
|
*
|
||||||
|
* @return bool
|
||||||
public function getCredentials(Request $request)
|
*/
|
||||||
{
|
public function supports(Request $request): bool
|
||||||
$credentials = [
|
{
|
||||||
'username' => $request->request->get('username'),
|
return self::LOGIN_ROUTE === $request->attributes->get('_route')
|
||||||
'password' => $request->request->get('password'),
|
&& $request->isMethod('POST');
|
||||||
'csrf_token' => $request->request->get('_csrf_token'),
|
}
|
||||||
];
|
|
||||||
$request->getSession()->set(
|
/**
|
||||||
Security::LAST_USERNAME,
|
* Get the authentication credentials from the request and return them
|
||||||
$credentials['username']
|
* as any type (e.g. an associate array).
|
||||||
);
|
*
|
||||||
|
* Whatever value you return here will be passed to getUser() and checkCredentials()
|
||||||
return $credentials;
|
*
|
||||||
}
|
* For example, for a form login, you might:
|
||||||
|
*
|
||||||
public function getUser($credentials, UserProviderInterface $userProvider)
|
* return [
|
||||||
{
|
* 'username' => $request->request->get('_username'),
|
||||||
$token = new CsrfToken('authenticate', $credentials['csrf_token']);
|
* 'password' => $request->request->get('_password'),
|
||||||
if (!$this->csrfTokenManager->isTokenValid($token)) {
|
* ];
|
||||||
throw new InvalidCsrfTokenException();
|
*
|
||||||
}
|
* Or for an API token that's on a header, you might use:
|
||||||
|
*
|
||||||
$user = $this->entityManager->getRepository(User::class)->findOneBy(['username' => $credentials['username']]);
|
* return ['api_key' => $request->headers->get('X-API-TOKEN')];
|
||||||
|
*
|
||||||
if (!$user) {
|
* @return array Any non-null value
|
||||||
throw new UsernameNotFoundException('Username could not be found.');
|
*
|
||||||
}
|
* @throws \UnexpectedValueException If null is returned
|
||||||
|
*/
|
||||||
return $user;
|
#[ArrayShape([
|
||||||
}
|
'username' => "mixed",
|
||||||
|
'password' => "mixed",
|
||||||
public function checkCredentials($credentials, UserInterface $user)
|
'csrf_token' => "mixed"
|
||||||
{
|
])]
|
||||||
return $this->passwordEncoder->isPasswordValid($user, $credentials['password']);
|
public function getCredentials(Request $request): array
|
||||||
}
|
{
|
||||||
|
$credentials = [
|
||||||
/**
|
'username' => $request->request->get('username'),
|
||||||
* Used to upgrade (rehash) the user's password automatically over time.
|
'password' => $request->request->get('password'),
|
||||||
*/
|
'csrf_token' => $request->request->get('_csrf_token'),
|
||||||
public function getPassword($credentials): ?string
|
];
|
||||||
{
|
$request->getSession()->set(
|
||||||
return $credentials['password'];
|
Security::LAST_USERNAME,
|
||||||
}
|
$credentials['username']
|
||||||
|
);
|
||||||
public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $providerKey)
|
|
||||||
{
|
return $credentials;
|
||||||
if ($targetPath = $this->getTargetPath($request->getSession(), $providerKey)) {
|
}
|
||||||
return new RedirectResponse($targetPath);
|
|
||||||
}
|
/**
|
||||||
|
* Return a UserInterface object based on the credentials.
|
||||||
// For example : return new RedirectResponse($this->urlGenerator->generate('some_route'));
|
*
|
||||||
throw new \Exception('TODO: provide a valid redirect inside '.__FILE__);
|
* The *credentials* are the return value from getCredentials()
|
||||||
}
|
*
|
||||||
|
* You may throw an AuthenticationException if you wish. If you return
|
||||||
protected function getLoginUrl()
|
* null, then a UsernameNotFoundException is thrown for you.
|
||||||
{
|
*
|
||||||
return $this->urlGenerator->generate(self::LOGIN_ROUTE);
|
* @param mixed $credentials
|
||||||
}
|
*
|
||||||
|
* @return UserInterface|null
|
||||||
|
* @throws AuthenticationException
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function getUser($credentials, UserProviderInterface $userProvider)
|
||||||
|
{
|
||||||
|
$token = new CsrfToken('authenticate', $credentials['csrf_token']);
|
||||||
|
if (!$this->csrfTokenManager->isTokenValid($token)) {
|
||||||
|
throw new InvalidCsrfTokenException();
|
||||||
|
}
|
||||||
|
|
||||||
|
// try username
|
||||||
|
$user = $this->entityManager->getRepository(User::class)->findOneBy(['username' => $credentials['username']]);
|
||||||
|
|
||||||
|
// try email
|
||||||
|
if (!$user) {
|
||||||
|
$user = $this->entityManager->getRepository(User::class)->findOneBy(['email' => $credentials['username']]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$user) {
|
||||||
|
throw new UsernameNotFoundException('Username or email could not be found.');
|
||||||
|
} else {
|
||||||
|
return $user;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the credentials are valid.
|
||||||
|
*
|
||||||
|
* If false is returned, authentication will fail. You may also throw
|
||||||
|
* an AuthenticationException if you wish to cause authentication to fail.
|
||||||
|
*
|
||||||
|
* The *credentials* are the return value from getCredentials()
|
||||||
|
*
|
||||||
|
* @param mixed $credentials
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*
|
||||||
|
* @throws AuthenticationException
|
||||||
|
*/
|
||||||
|
public function checkCredentials($credentials, UserInterface $user)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
//return $this->passwordEncoder->isPasswordValid($user, $credentials['password']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to upgrade (rehash) the user's password automatically over time.
|
||||||
|
*/
|
||||||
|
public function getPassword($credentials): ?string
|
||||||
|
{
|
||||||
|
return $credentials['password'];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $providerKey)
|
||||||
|
{
|
||||||
|
if ($targetPath = $this->getTargetPath($request->getSession(), $providerKey)) {
|
||||||
|
return new RedirectResponse($targetPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new RedirectResponse($this->urlGenerator->generate('blog'));
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getLoginUrl()
|
||||||
|
{
|
||||||
|
return $this->urlGenerator->generate(self::LOGIN_ROUTE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
section:
|
||||||
|
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
teaserImage
|
||||||
|
|
||||||
|
|
||||||
|
blog:
|
||||||
|
|
||||||
|
title,
|
||||||
|
teaser,
|
||||||
|
teaserImage
|
||||||
|
content,
|
||||||
|
autor => user,
|
||||||
|
section => section,
|
||||||
|
createdAt,
|
||||||
|
editedAt,
|
||||||
|
editedby => user
|
||||||
|
editreason
|
||||||
|
|
||||||
|
|
||||||
|
comment:
|
||||||
|
|
||||||
|
blog => blog
|
||||||
|
title,
|
||||||
|
content,
|
||||||
|
author => user,
|
||||||
|
createdAt,
|
||||||
|
editedAt,
|
||||||
|
editedby => user,
|
||||||
|
editreason
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue