• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Symfony - problem z autentykacją użytkownika na gotowej bazie danych

Object Storage Arubacloud
0 głosów
126 wizyt
pytanie zadane 13 kwietnia 2020 w PHP przez XiverKi Bywalec (2,050 p.)
zamknięte 13 kwietnia 2020 przez XiverKi
Argument 3 passed to Symfony\Component\Security\Guard\Token\PostAuthenticationGuardToken::__construct() must be of the type array, null given,
called in /home/ja/Sites/lopus-accmaker/vendor/symfony/security-guard/AbstractGuardAuthenticator.php on line 35

Problem udało się rozwiązać, odpowiedź na dole. 

Opis sytuacji:

Robie aplikacje, które przeprowadzać będzie różne akcje na bazie danych, którą dostarcza mi gra. Baza danych jest gotowa, konta użytkowników przechowuje baza danych o nazwie "Accounts" za pomocą narzedzie wykonałem sobie zrzut struktury bazy danych do Encji w symfony.

Wszystko wygląda cudownie do momentu autentykacji. Wszystko przechodzi, dodałem własny password encoder 

 

class Sha1PasswordEncoder implements PasswordEncoderInterface
{

    /**
     * @inheritDoc
     */
    public function encodePassword(string $raw, ?string $salt)
    {
        return sha1($raw);
    }

    /**
     * @inheritDoc
     */
    public function isPasswordValid(string $encoded, string $raw, ?string $salt)
    {
        return sha1($raw) == $encoded;
    }

Korzystam z niego w autentykatorze, metodzie checkCredentials

public function checkCredentials($credentials, UserInterface $user)
{
    return $this->passwordEncoder->isPasswordValid(
        $this->passwordEncoder->encodePassword($credentials['password'], null),
        $credentials['password'],
        null
    );
}

Return zwraca true. Po przejściu dalej zwraca błąd z góry tego posta.
Najpierw autentykator budowałem sam, jednakże po spotkaniu tego błędy spróbowałem wygenerować go automtycznie. Niestety błąd się powtarza.

Cały kod:

class LoginFormAuthenticator extends AbstractFormLoginAuthenticator
{
    use TargetPathTrait;

    public const LOGIN_ROUTE = 'app_login';

    private $entityManager;
    private $urlGenerator;
    private $csrfTokenManager;
    /**
     * @var Sha1PasswordEncoder
     */
    private $passwordEncoder;

    public function __construct(EntityManagerInterface $entityManager, UrlGeneratorInterface $urlGenerator,
                                CsrfTokenManagerInterface $csrfTokenManager, Sha1PasswordEncoder $passwordEncoder)
    {
        $this->entityManager = $entityManager;
        $this->urlGenerator = $urlGenerator;
        $this->csrfTokenManager = $csrfTokenManager;
        $this->passwordEncoder = $passwordEncoder;
    }

    public function supports(Request $request)
    {
        return self::LOGIN_ROUTE === $request->attributes->get('_route')
            && $request->isMethod('POST');
    }

    public function getCredentials(Request $request)
    {
        $credentials = [
            'email' => $request->request->get('email'),
            'password' => $request->request->get('password'),
            'csrf_token' => $request->request->get('_csrf_token'),
        ];
        $request->getSession()->set(
            Security::LAST_USERNAME,
            $credentials['email']
        );

        return $credentials;
    }

    public function getUser($credentials, UserProviderInterface $userProvider)
    {
        $token = new CsrfToken('authenticate', $credentials['csrf_token']);
        if (!$this->csrfTokenManager->isTokenValid($token)) {
            throw new InvalidCsrfTokenException();
        }

        $user = $this->entityManager->getRepository(Accounts::class)->findOneBy(['email' => $credentials['email']]);

        if (!$user) {
            // fail authentication with a custom error
            throw new CustomUserMessageAuthenticationException('Email could not be found.');
        }

        return $user;
    }

    public function checkCredentials($credentials, UserInterface $user)
    {
        return $this->passwordEncoder->isPasswordValid(
            $this->passwordEncoder->encodePassword($credentials['password'], null),
            $credentials['password'],
            null
        );
    }

    public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
    {
        if ($targetPath = $this->getTargetPath($request->getSession(), $providerKey)) {
            return new RedirectResponse($targetPath);
        }

        // For example : return new RedirectResponse($this->urlGenerator->generate('some_route'));
        throw new \Exception('TODO: provide a valid redirect inside '.__FILE__);
    }

    protected function getLoginUrl()
    {
        return $this->urlGenerator->generate(self::LOGIN_ROUTE);
    }
}

 

ROZWIĄZANIE:

Ok problemem było brak pola roles w bazie oraz encji.

komentarz zamknięcia: Ok problemem było brak pola roles w bazie oraz encji.
komentarz 14 kwietnia 2020 przez HaKIM Szeryf (87,590 p.)

Dzięki za podanie rozwiązania, inni użytkownicy forum oraz internauci na tym skorzystają. yes

Podobne pytania

0 głosów
0 odpowiedzi 140 wizyt
pytanie zadane 12 lipca 2019 w PHP przez pirx1988 Nowicjusz (120 p.)
0 głosów
0 odpowiedzi 120 wizyt
+1 głos
1 odpowiedź 282 wizyt
pytanie zadane 21 kwietnia 2019 w PHP przez hiper007 Stary wyjadacz (11,270 p.)

92,573 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...