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
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
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:
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
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
{% 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):
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:
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: { }