<?php
namespace App\Security;
/*
---------------------------------------------------
v0.0001
28.9.2020 (Maša)
- prva verzija .. dodan tehnolog
---------------------------------------------------
v0.0002
22.2.2021 (Borut)
Dodan modul v tabeli zaposleni
---------------------------------------------------
*/
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
use Symfony\Component\Security\Core\Exception\InvalidCsrfTokenException;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Csrf\CsrfToken;
use Symfony\Component\Security\Csrf\CsrfTokenManagerInterface;
use Symfony\Component\Security\Guard\Authenticator\AbstractFormLoginAuthenticator;
use Symfony\Component\Security\Guard\PasswordAuthenticatedInterface;
use Symfony\Component\Security\Http\Util\TargetPathTrait;
use Doctrine\DBAL\Connection;
class LoginFormAuthenticator extends AbstractFormLoginAuthenticator implements PasswordAuthenticatedInterface
{
use TargetPathTrait;
private $urlGenerator;
private $csrfTokenManager;
private $passwordEncoder;
private $dbconnection;
public function __construct(UrlGeneratorInterface $urlGenerator, CsrfTokenManagerInterface $csrfTokenManager, UserPasswordEncoderInterface $passwordEncoder, Connection $connection)
{
$this->urlGenerator = $urlGenerator;
$this->csrfTokenManager = $csrfTokenManager;
$this->passwordEncoder = $passwordEncoder;
$this->dbconnection = $connection;
}
public function supports(Request $request)
{
return 'app_login' === $request->attributes->get('_route')
&& $request->isMethod('POST');
}
public function getCredentials(Request $request)
{
$credentials = [
'username' => $request->request->get('username'),
'password' => $request->request->get('password'),
'csrf_token' => $request->request->get('_csrf_token'),
];
$request->getSession()->set(
Security::LAST_USERNAME,
$credentials['username']
);
return $credentials;
}
public function getUser($credentials, UserProviderInterface $userProvider)
{
$token = new CsrfToken('authenticate', $credentials['csrf_token']);
if (!$this->csrfTokenManager->isTokenValid($token)) {
throw new InvalidCsrfTokenException();
}
// Load / create our user however you need.
// You can do this by calling the user provider, or with custom logic here.
//$roles[] = array();
$lUserName = $credentials['username'];
$lQuery = "SELECT * FROM users u, companies c WHERE u.user_username ='$lUserName' AND u.user_status = 1 AND u.company_id = c.company_id";
$lSqlUser = $this->dbconnection->fetchAllAssociative($lQuery);
foreach ($lSqlUser as $userdata)
{
$lQuery = "SELECT * FROM actions WHERE ROLE_SUPERUSER = 1";
$lSqlAkcije = $this->dbconnection->fetchAllAssociative($lQuery);
foreach ($lSqlAkcije as $akcije)
{
$roles[] = $akcije['akcije_rola'];
}
$user = new User();
$user->setUsername($userdata['user_username']);
$user->setId($userdata['user_id']);
$user->setName($userdata['user_name'] . ' ' . $userdata['user_surname']);
$user->setPassword($userdata['user_password']);
$user->setEmail($userdata['user_email']);
$user->setModul($userdata['user_modul']);
$user->setCompany($userdata['company_id']);
$user->setFolder($userdata['company_folder']);
$user->setCompanyName($userdata['company_name']);
$roles[] ='ROLE_ADMIN';
$user->setRoles($roles);
//file_put_contents("session.log", "/var/www/nota/uploads/moxiemanager/company/". $user->getFolder() . "/files/");
$_SESSION['filesystem.rootpath']="/var/www/nota/public/vendors/tinymce/js/tinymce/plugins/moxiemanager/data/files/". $user->getFolder();
//$_SESSION['filesystem.local.wwwroot']="/var/www/html/";
}
if(empty($user))
{
throw new CustomUserMessageAuthenticationException('Uporabnik ne obstaja.');
}
//$user = $userProvider->loadUserByUsername($credentials['username']);
//$user->setName('Borut Kacin');
//$user->setEmail('borut.kacin@gmail.com');
//$user->setId('10');
/*if (!$user) {
// fail authentication with a custom error
throw new CustomUserMessageAuthenticationException('Uporabnik ne obstaja.');
}*/
return $user;
}
public function checkCredentials($credentials, UserInterface $user)
{
//dd($user);
//file_put_contents("avtorizacija5.log", print_r($user, true));
//file_put_contents("avtorizacija6.log", print_r($credentials, true));
//$bla = $this->passwordEncoder->isPasswordValid($user, $credentials['password']);
//file_put_contents("avtorizacija7.log", print_r($bla, true));
//return $this->passwordEncoder->isPasswordValid($user, $credentials['password']);
$valid = false;
file_put_contents("user.log", print_r($user->getUserName(), true));
$valid = $this->passwordEncoder->isPasswordValid($user, $credentials['password']);
return $valid;
}
/**
* 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, $providerKey)
{
if ($targetPath = $this->getTargetPath($request->getSession(), $providerKey)) {
return new RedirectResponse($targetPath);
}
return new RedirectResponse($this->urlGenerator->generate('content'));
// 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('app_login');
}
}