security - symfony2 can't login “Bad credentials” -
i writing website using symfony framework reason, login process not working.
message: bad credentials
here security.yml
# app/config/security.yml jms_security_extra: secure_all_services: false expressions: true security: firewalls: secured_area: pattern: ^/ anonymous: ~ form_login: login_path: /login check_path: /login_check access_control: - { path: ^/admin, roles: role_admin } providers: in_memory: memory: users: user: { password: userpass, roles: [ 'role_user' ] } contant_manager: { password: manpass, roles: [ 'role_content_manager' ] } admin: { password: adminpass, roles: [ 'role_admin' ] } encoders: symfony\component\security\core\user\user: plaintext
my user.php class
<?php namespace youmustknowit\newsbundle\entity; use doctrine\orm\mapping orm; use symfony\component\security\core\user\advanceduserinterface; use doctrine\common\collections\arraycollection; use apy\datagridbundle\grid\mapping grid; /** * @orm\table(name="users") * @orm\entity(repositoryclass="\youmustknowit\newsbundle\entity\userrepository") * * @grid\source(columns="id, username, email, role.name, isactive") */ class user implements advanceduserinterface, \serializable { /** * @orm\column(type="integer") * @orm\id * @orm\generatedvalue(strategy="auto") * * @grid\column(filterable=false) */ private $id; /** * @orm\column(type="string", length=25, unique=true) */ private $username; /** * @orm\column(type="string", length=32) */ private $salt; /** * @orm\column(type="string", length=100) */ private $password; /** * @orm\column(type="string", length=60, unique=true) */ private $email; /** * @orm\manytomany(targetentity="roleslist", inversedby="users") * * @grid\column(field="roleslist.role", type="text", filter="select", title="role") */ private $role; /** * @orm\onetomany(targetentity="newscatalog", mappedby="user") * @orm\column(name="created_news", nullable=true) */ private $creatednews; /** * @orm\column(name="is_active", type="boolean") */ private $isactive; public function __construct() { $this->isactive = false; $this->salt = md5(uniqid(null, true)); $this->role = new \doctrine\common\collections\arraycollection(); $this->creatednews = new \doctrine\common\collections\arraycollection(); } public function __tostring() { return $this->username; } public function isaccountnonexpired() { return true; } public function isaccountnonlocked() { return true; } public function iscredentialsnonexpired() { return true; } public function isenabled() { return $this->isactive; } /** * @inheritdoc */ public function getroles() { return $this->role->toarray(); } /** * @inheritdoc */ public function getusername() { return $this->username; } /** * @inheritdoc */ public function getsalt() { return $this->salt; } /** * @inheritdoc */ public function getpassword() { return $this->password; } /** * @inheritdoc */ public function getemail() { return $this->email; } /** * @inheritdoc */ public function erasecredentials() { } /** * @see \serializable::serialize() */ public function serialize() { return serialize(array( $this->id, )); } /** * @see \serializable::unserialize() */ public function unserialize($serialized) { list ( $this->id, ) = unserialize($serialized); } /** * id * * @return integer */ public function getid() { return $this->id; } /** * set username * * @param string $username * @return user */ public function setusername($username) { $this->username = $username; return $this; } /** * set salt * * @param string $salt * @return user */ public function setsalt($salt) { $this->salt = $salt; return $this; } /** * set password * * @param string $password * @return user */ public function setpassword($password) { $this->password = $password; return $this; } /** * set email * * @param string $email * @return user */ public function setemail($email) { $this->email = $email; return $this; } /** * set isactive * * @param boolean $isactive * @return user */ public function setisactive($isactive) { $this->isactive = $isactive; return $this; } /** * isactive * * @return boolean */ public function getisactive() { return $this->isactive; } /** * add role * * @param \youmustknowit\newsbundle\entity\roleslist $role * @return user */ public function addrole(\youmustknowit\newsbundle\entity\roleslist $role) { $this->role[] = $role; return $this; } /** * remove role * * @param \youmustknowit\newsbundle\entity\roleslist $role */ public function removerole(\youmustknowit\newsbundle\entity\roleslist $role) { $this->role->removeelement($role); } /** * add creatednews * * @param \youmustknowit\newsbundle\entity\newscatalog $creatednews * @return user */ public function addcreatednews(\youmustknowit\newsbundle\entity\newscatalog $creatednews) { $this->creatednews[] = $creatednews; return $this; } /** * remove creatednews * * @param \youmustknowit\newsbundle\entity\newscatalog $creatednews */ public function removecreatednews(\youmustknowit\newsbundle\entity\newscatalog $creatednews) { $this->creatednews->removeelement($creatednews); } /** * creatednews * * @return \doctrine\common\collections\collection */ public function getcreatednews() { return $this->creatednews; } /** * role * * @return \doctrine\common\collections\collection */ public function getrole() { return $this->role; } }
my userrepository.php class
<?php namespace youmustknowit\newsbundle\entity; use symfony\component\security\core\user\userinterface; use symfony\component\security\core\user\userproviderinterface; use symfony\component\security\core\exception\usernamenotfoundexception; use symfony\component\security\core\exception\unsupporteduserexception; use doctrine\orm\entityrepository; use doctrine\orm\noresultexception; class userrepository extends entityrepository implements userproviderinterface { public function loaduserbyusername($username) { $q = $this ->createquerybuilder('u') ->select('u, g') ->leftjoin('u.groups', 'g') ->where('u.username = :username or u.email = :email') ->setparameter('username', $username) ->setparameter('email', $username) ->getquery(); try { $user = $q->getsingleresult(); } catch (noresultexception $e) { $message = sprintf( 'unable find active admin user object identified "%s".', $username ); throw new usernamenotfoundexception($message, 0, $e); } return $user; } public function refreshuser(userinterface $user) { $class = get_class($user); if (!$this->supportsclass($class)) { throw new unsupporteduserexception( sprintf( 'instances of "%s" not supported.', $class ) ); } return $this->find($user->getid()); } public function supportsclass($class) { return $this->getentityname() === $class || is_subclass_of($class, $this->getentityname()); } public function findall() { return $this->createquerybuilder('u'); } }
securitycontroller.php
<?php namespace youmustknowit\newsbundle\controller; use symfony\bundle\frameworkbundle\controller\controller; use symfony\component\security\core\securitycontext; use sensio\bundle\frameworkextrabundle\configuration\route; use symfony\component\httpfoundation\request; use youmustknowit\newsbundle\entity\user; class securitycontroller extends controller { /** * @route("/login", name="login") */ public function loginaction() { $request = $this->getrequest(); $session = $request->getsession(); if ($request->attributes->has(securitycontext::authentication_error)) { $error = $request->attributes->get( securitycontext::authentication_error ); } else { $error = $session->get(securitycontext::authentication_error); $session->remove(securitycontext::authentication_error); } return $this->render( 'youmustknowitnewsbundle:user:login.html.twig', array( 'last_username' => $session->get(securitycontext::last_username), 'error' => $error, ) ); } /** * @route("/login_check", name="login_check") */ public function logincheckaction() { } /** * @route("/logout", name="logout") */ public function logoutaction() { } /** * @route("/recover_pass", name="recover_pass") */ public function recoverpasswordaction(request $request) { $data = array(); $form = $this->createformbuilder($data) ->add('email', 'email') ->getform(); if ($request->getmethod() == 'post') { $form->bind($request); if ($form->isvalid()) { $data = $form->getdata(); $user = $this->getdoctrine() ->getrepository('youmustknowitnewsbundle:user') ->findonebyemail($data['email']); if (isset($user)) { $this->createnewpassword($user); return $this->redirect($this->generateurl('homepage')); } else { $this->get('session')->getflashbag()->add( 'error_message', 'the user such email doesn\'t exist.' ); } } } return $this->render('youmustknowitnewsbundle:default:recoverpass.html.twig', array( 'form' => $form->createview() )); } private function sendemail(user $user) { $message = \swift_message::newinstance() ->setsubject('youmustknowit! password restoration.') ->setfrom('php.gr2@gmail.com') ->setto($user->getemail()) ->setbody('your new password: ' . $user->getpassword()); $this->get('mailer')->send($message); } private function generatepassword($length = 7) { $num = range(0, 9); $alf = range('a', 'z'); $_alf = range('a', 'z'); $symbols = array_merge($num, $alf, $_alf); shuffle($symbols); $code_array = array_slice($symbols, 0, $length); $code = implode("", $code_array); return $code; } private function encodepassword(user $user) { $factory = $this->get('security.encoder_factory'); $encoder = $factory->getencoder($user); $password = $encoder->encodepassword( $user->getpassword(), $user->getsalt() ); return $password; } private function createnewpassword(user $user) { $password = $this->generatepassword(); $user->setpassword($password); $this->sendemail($user); $encodedpassword = $this->encodepassword($user); $user->setpassword($encodedpassword); $em = $this->getdoctrine()->getentitymanager(); $em->persist($user); $em->flush(); $this->get('session')->getflashbag()->add( 'success_message', 'on email new password sent.' ); } }
and login.html.twig
{% extends '::base.html.twig' %} {% block body %} {% if error %} <div>{{ error.message }}</div> {% endif %} <form action="{{ path('login_check') }}" method="post"> <label for="username">username:</label> <input type="text" id="username" name="_username" value="{{ last_username }}" /> <label for="password">password:</label> <input type="password" id="password" name="_password" /> #<input type="hidden" name="_csrf_token" value="/" /> <input type="submit" name="login" /> </form> {% endblock %}
if using entity mapped database provider:
missing correct mapping.
providers: users: entity: { class: youmustknowitnewsbundle:user, property: username }
Comments
Post a Comment