Ver Mensaje Individual
  #1 (permalink)  
Antiguo 17/04/2016, 10:14
mrmoon
 
Fecha de Ingreso: enero-2016
Mensajes: 15
Antigüedad: 8 años, 3 meses
Puntos: 0
Seguridad: Creando un login con tabla User

Buenas de nuevo.
Ya tengo mas o menos encaminada la practica.
Esta empezó gestionando una tabla de usuarios(User), mas adelante se relaciono con otras tablas, las cuales también se gestionaban, ampliándose el proyecto, poco a poco.
Quiero cerrarlo con la gestión de usuarios y sesiones. En principio, por ahora, solo quería que se loguearan los administradores, en todas las direcciones.
He probado como 5 login distintos y ya no me aclaro.
La configuración de los ficheros es:

security.yml
Código PHP:
# To get started with security, check out the documentation:
# http://symfony.com/doc/current/book/security.html
security:

    
# http://symfony.com/doc/current/book/security.html#where-do-users-come-from-user-providers
    
providers:
        
in_memory:
            
memory: ~
        
main:
            
entity: { class: inventariouserBundleEntityUserpropertyusername }

    
firewalls:
        
# disables authentication for assets and the profiler, adapt it according to your needs
        
dev:
            
pattern: ^/(_(profiler|wdt)|css|images|js)/
            
securityfalse
        login
:
            
pattern:  ^/login$
            
securityfalse    
            
        secured_area
:
            
pattern:    ^/
            
anonymous:  ~
            
form_login:
                
login_path:  user_login
                check_path
:  user_login
            logout
:
                
pathuser_logout
                target
: /
       
            
# activate different ways to authenticate

            # http_basic: ~
            # http://symfony.com/doc/current/book/security.html#a-configuring-how-your-users-will-authenticate

            # form_login: ~
            # http://symfony.com/doc/current/cookbook/security/form_login_setup.html


    
providers:
        
our_db_provider:
            
entity:
                class: 
userBundle:User
                property
username
                
# if you're using multiple entity managers
                # manager_name: customer
    

    
firewalls:
        
main:
            
pattern:    ^/
            
http_basic: ~
            
providerour_db_provider

    access_control
:
        - { 
path: ^/loginrolesIS_AUTHENTICATED_ANONYMOUSLY }
        - { 
path: ^/, rolesROLE_ADMIN }            
        
    
encoders:
        
inventariouserBundleEntityUser:
            
algorithmbcrypt
            cost
12 
routing.yml

Código PHP:
user_homepage:
    
path:     /
    
defaults: { _controlleruserBundle:Default:login}
user_login:
    
path:     /login
    defaults
: { _controlleruserBundle:Default:login }
user_check:
    
path:     /check

user_logout
:
    
path:     /logout
    defaults
: { _controlleruserBundle:Default:logout }
user_prueba:
    
path:     /prueba
    defaults
: { _controlleruserBundle:Default:prueba }
user_index:
    
path:       /user/index
    defaults
: { _controlleruserBundle:User:index }
user_add:
    
path:     /user/add
    defaults
: { _controlleruserBundle:User:add }
    
user_create:
..................... 
login.html.twig

Código PHP:
{% extends '::frontend.html.twig' %}
{% 
block body %}
{% for 
flashMessage in app.session.flashbag.get('mensaje') %}
<
span class="alert-success">
       {{ 
flashMessage }}
      <
hr />
</
span>
{% endfor %}
<
div class="row">
<
div class="col-sm-4"></div>
<
div class="col-sm-4">    
<
h1>Ingrese sus datos</h1>
</
div>
<
div class="col-sm-4"></div>
</
div>



 <
form class="form-horizontal" role="form" method="POST" action="{{path('user_check')}}">
<
div class="row">
<
div class="col-sm-4"></div>
            <
div class="form-group">
            <
label for="inputEmail3" class="col-sm-1 control-label">{{'Username'|trans}}</label>
            <
div class="col-sm-3">
                        <
input type="text" name="_username" class="form-control" id="inputEmail3" value="{{ last_username }}" />
  />
            </
div>
            </
div>
</
div>
<
div class="row">
<
div class="col-sm-4"></div
    <
div class="form-group">
      <
label for="inputPassword3" class="col-sm-1 control-label">Password</label>
      <
div class="col-sm-3">
        <
input type="password" name="_password" class="form-control" id="inputPassword3" placeholder="Password" />
      </
div>
    </
div>
</
div>         
<
div class="row">
<
div class="col-sm-4"></div>         
    <
div class="form-group">
      <
div class="col-sm-3">
        <
button type="submit" class="btn btn-default">{{'Sign in'|trans}}</button>
      </
div>
    </
div>
  </
form>
<
div class="col-sm-4"></div>
</
div>
   {% 
endblock %} 
DefaultController.php

Código PHP:
<?php

namespace inventariouserBundleController
;

use 
SymfonyBundleFrameworkBundleControllerController;
use 
SymfonyComponentHttpFoundationRequest;
use 
SymfonyComponentSecurityCoreSecurityContext;
use 
SymfonyComponentSecurityCoreExceptionAuthenticationException;
use 
SymfonyComponentDependencyInjectionContainerAware;
use 
SymfonyBridgeDoctrineFormTypeEntityType;
use 
inventariouserBundleEntityUser;
use 
inventariouserBundleFormUserType;
use 
DoctrineORMEntityRepository;
use 
SymfonyComponentFormAbstractType;
use 
SymfonyComponentFormFormBuilder;
use 
SymfonyComponentFormExtensionCoreTypeTextType;
use 
SymfonyComponentFormExtensionCoreTypeChoiceType;
use 
SymfonyComponentFormExtensionCoreTypeButtonType;



class 
DefaultController extends Controller
{
   
  public function 
loginAction()
    {
        
$request $this->getRequest();
        
$session $request->getSession();

        
// get the login error if there is one
        
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(
            
'userBundle:Default:login.html.twig',
            array(
                
// last username entered by the user
                
'last_username' => $session->get(SecurityContext::LAST_USERNAME),
                
'error'         => $error,
            )
        );
    }
    public function 
checkAction()
    {
        throw new 
RuntimeException('You must configure the check path to be handled by the firewall using form_login in your security firewall configuration.');
    }
............
Hay mucho código que debe sobrar de hacer pruebas.
Cuando ejecuto el programa se va al login y aparece

UndefinedMethodException in DefaultController.php line 49:
Attempted to call an undefined method named "getRequest" of class "inventario\userBundle\Controller\DefaultControlle r".

De alguna forma es lógico porque el objeto todavía no se ha creado, pero he visto montones de ejemplos y todos empiezan con:
Código PHP:
     $request $this->getRequest(); 
No comprendo cual es el procedimiento que hay entre security.yml y el controlador, ¿Que se tiene que ejecutar en medio? ¿Llama al login antes que al controlador y de esta manera ya esta creado Request?
¿Alguien tiene un ejemplo pequeño que funcione y que pueda ver?.
Saludos Luis.