I have a problem here.
I'm in a project using symfony (very good Framework), however I've seen some complexities of how it does authentication. I was able to login, but at the time of entering the home, as it is protected in the file of segirança for only ROLE_ADMIN access, I would like to know of you, in symfony3, how do I recover this permission for my user, the user already has the implementations all, but symfony does not see it as ROLE_ADMIN. Follow the code.
Controller
public function loginAction(Request $request)
{
if ($request->get('usuario')) {
$usuario = $request->get('usuario');
$senha = $request->get('senha');
$user_manager = $this->getDoctrine()->getRepository('AppBundle:Usuarios');
$factory = $this->get('security.encoder_factory');
$user = $user_manager->loadUserByUsername($usuario);
$encoder = $factory->getEncoder($user);
$salt = $user->getSalt();
if($encoder->isPasswordValid($user->getPassword(), $senha, $salt)) {
return $this->redirect('/home');
}
else {
$this->addFlash('error', 'Usuario ou senha não não encontrados!');
return $this->redirect('/');
}
}
$authenticationUtils = $this->get('security.authentication_utils');
$error = $authenticationUtils->getLastAuthenticationError();
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render(
'login/index.html.twig',
array(
'last_username' => $lastUsername,
'error' => $error,
)
);
}
Repository
class UserRepository extends EntityRepository implements UserLoaderInterface
{
public function loadUserByUsername($username)
{
$user = $this->createQueryBuilder('u')
->where('u.usulogin = :usulogin')
->setParameter('usulogin', $username)
->getQuery()
->getOneOrNullResult();
if (null === $user) {
$message = sprintf(
'Unable to find an active admin AppBundle:User object identified by "%s".',
$username
);
throw new UsernameNotFoundException($message);
}
return $user;
}
}
Entity
class Usuarios implements UserInterface, \Serializable
{
//codigos não coloquei a classe interira, apenas a implemetação da interface, para ficar menor, porem garanto estar de acordo com a doc.
/**
* inicio das implementações da inteface
*/
public function getUsername()
{
return $this->usunom;
}
public function getRoles()
{
return array('ROLE_ADMIN');
}
public function getPassword()
{
return $this->ususenha;
}
public function getSalt()
{
return null;
}
public function eraseCredentials()
{
}
/** @see \Serializable::serialize() */
public function serialize()
{
return serialize(array(
$this->usuid,
$this->usunom,
$this->ususenha,
// ver la sección salt debajo
// $this->salt,
));
}
/** @see \Serializable::unserialize() */
public function unserialize($serialized)
{
list (
$this->usuid,
$this->usunom,
$this->ususenha,
// ver la sección salt debajo
// $this->salt
) = unserialize($serialized);
}
}
Security.yml
# app/config/security.yml
security:
encoders:
AppBundle\Entity\Usuarios:
algorithm: bcrypt
providers:
our_db_provider:
entity:
class: AppBundle:Usuarios
firewalls:
main:
provider: our_db_provider
anonymous: true
form_login:
login_path: /login
check_path: /
logout:
path: /logout
target: /login
remember_me:
secret: '%secret%'
lifetime: 604800 # 1 week in seconds
path: /
access_control:
- { path: ^/home, roles: ROLE_ADMIN }
# ...
all Help is welcome ...