I tried to implement everything per Symfony documentation but authentication seems to not work at all. Take a look at what I exactly did:
security.yml
JavaScript
x
security:
encoders:
AppBundleEntityStUser:
algorithm: bcrypt
cost: 12
providers:
our_db_provider:
entity:
class: AppBundle:Entity:StUser
firewalls:
user_secured_area:
pattern: ^/([a-z]{2})/account
provider: our_db_provider
form_login:
login_path: login
check_path: login_check
csrf_token_generator: security.csrf.token_manager
default:
anonymous: ~
http_basic: ~
StUser.php entity
JavaScript
namespace AppBundleEntity;
class StUser implements UserInterface
{
private $id;
private $firstName;
private $lastName;
private $password;
private $username;
private $isAdmin = '0';
private $confirmed;
private $created = 'CURRENT_TIMESTAMP';
private $status = '1';
public function getId()
{
return $this->id;
}
public function setFirstName($firstName)
{
$this->firstName = $firstName;
return $this;
}
public function getFirstName()
{
return $this->firstName;
}
public function setLastName($lastName)
{
$this->lastName = $lastName;
return $this;
}
public function getLastName()
{
return $this->lastName;
}
public function setPassword($password)
{
$this->password = $password;
return $this;
}
public function getPassword()
{
return $this->password;
}
public function setUsername($username)
{
$this->username = $username;
return $this;
}
public function getUsername()
{
return $this->username;
}
public function setIsAdmin($isAdmin)
{
$this->isAdmin = $isAdmin;
return $this;
}
public function getIsAdmin()
{
return $this->isAdmin;
}
public function setConfirmed($confirmed)
{
$this->confirmed = $confirmed;
return $this;
}
public function getConfirmed()
{
return $this->confirmed;
}
public function setCreated($created)
{
$this->created = $created;
return $this;
}
public function getCreated()
{
return $this->created;
}
public function setStatus($status)
{
$this->status = $status;
return $this;
}
public function getStatus()
{
return $this->status;
}
/* ==== Additional =================================================== */
public function __construct($username, $password, $salt, array $roles)
{
$this->username = $username;
$this->password = $password;
/* $this->salt = $salt; */
/* $this->roles = $roles; */
}
public function getRoles()
{
return null;
}
public function getSalt()
{
return null;
}
public function eraseCredentials()
{
}
}
UserRepository.php repository:
JavaScript
namespace AppBundleRepository;
use SymfonyBridgeDoctrineSecurityUserUserLoaderInterface;
use DoctrineORMEntityRepository;
class UserRepository extends EntityRepository implements UserLoaderInterface
{
public function loadUserByUsername($username)
{
return $this->createQueryBuilder('u')
->where('u.username = :username OR u.email = :email')
->setParameter('username', $username)
->setParameter('email', $username)
->getQuery()
->getOneOrNullResult();
}
}
AccountController.php
JavaScript
namespace AccountBundleController;
use SensioBundleFrameworkExtraBundleConfigurationRoute;
use SymfonyBundleFrameworkBundleControllerController;
use SymfonyComponentHttpFoundationRequest;
class AccountController extends Controller
{
/**
* @Route("{_lang}/login", name="login", requirements={"_lang": "pl"})
*/
public function loginAction(Request $request, $_lang = '')
{
$helper = $this->get('security.authentication_utils');
$error = $helper->getLastAuthenticationError();
var_dump( $error );
return $this->render('account/login.html.twig', array(
'projects' => "",
'lang' => "pl",
'allLangs' => "",
'mainLang' => "",
'meta_title' => "test",
'meta_description' => "",
'meta_keywords' => "",
'meta_robots' => "",
'image_src' => "",
'social_title' => "",
'social_description' => "",
'social_url' => "",
'aaaa' => $helper,
/* 'last_username' => $lastUsername,
'error' => $error, */
));
}
}
login.html.twig view
JavaScript
{% block body %}
<form action="{{ path('login', {'_lang': lang}) }}" method="post">
<label for="username">Username:</label>
<input type="text" id="username" name="_username" value="" />
<label for="password">Password:</label>
<input type="password" id="password" name="_password" />
<input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}">
<button type="submit">login</button>
</form>
{% endblock %}
And nothing happens, $helper and $error are empty / null, nothing I can find in logs. What I missed. Thanks in advance.
Advertisement
Answer
I tried that but without success. It looks like any custom code is never called.
I’ve updated security.yml (when I set anonymous: ~, then it allows users to open for exampple account page without authorization):
JavaScript
security:
encoders:
AppBundleEntityStUser:
algorithm: bcrypt
cost: 12
providers:
our_db_provider:
entity:
class: AppBundle:StUser
firewalls:
user_secured_area:
pattern: ^/([a-z]{2})/account
# anonymous: ~
provider: our_db_provider
form_login:
login_path: login
check_path: login_check
csrf_token_generator: security.csrf.token_manager
default:
anonymous: ~
http_basic: ~
and also I’ve updated User entity:
StUser.orm.yml entity:
JavaScript
AppBundleEntityStUser:
type: entity
table: st_user
repositoryClass: AppBundleRepositoryUserRepository
indexes:
status_username_password:
columns:
- status
- username
- password
status_is_admin_username_password:
columns:
- status
- is_admin
- username
- password
id:
id:
type: integer
nullable: false
options:
unsigned: false
id: true
generator:
strategy: IDENTITY
fields:
firstName:
type: string
nullable: true
length: 255
options:
fixed: false
column: first_name
lastName:
type: string
nullable: true
length: 255
options:
fixed: false
column: last_name
password:
type: string
nullable: true
length: 255
options:
fixed: false
username:
type: string
nullable: true
length: 255
options:
fixed: false
isAdmin:
type: boolean
nullable: false
options:
default: '0'
column: is_admin
confirmed:
type: datetime
nullable: true
created:
type: datetime
nullable: false
options:
default: CURRENT_TIMESTAMP
status:
type: boolean
nullable: false
options:
default: '0'
lifecycleCallbacks: { }