Diferencia entre revisiones de «Usuario:ManuelRomero/Laravel/autentificacion/ejemplo»
De WikiEducator
(→Preparando las rutas) |
|||
Línea 271: | Línea 271: | ||
</body> | </body> | ||
</html | </html | ||
+ | </source> | ||
;logout | ;logout | ||
*Para terminar nos falta implementar el método logout | *Para terminar nos falta implementar el método logout | ||
− | <source lang=php | + | <source lang=php> |
/* | /* | ||
Volvemos a mostrar el formulario de login indicando que se cerró la sesion | Volvemos a mostrar el formulario de login indicando que se cerró la sesion |
Revisión de 02:17 3 jun 2015
- A continuación vamos a realizar un sistema de logín donde vemos todos los conceptos
- Crearemos el proyecto indicando todos los pasos
Creando el proyecto
- Creamos un proyecto nuevo
composer create-project laravel/laravel=4.2 autentificacion
- Configuramos la base de datos para crear en ella la tabla de usuarios
- Realizamos la siguiente configuración
'seguridad' => array( 'driver' => 'mysql', 'host' => 'localhost', 'database' => 'tienda', 'username' => 'root', 'password' => 'root', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ),
- Creamos las tablas con migration
php artisan make:migration tablaUsuarios php artisan migrate
- Ahora vemos que ha creado las tablas en la base de datos
- Estas tablas con estos campos las ha creado debido a la migración que ya viene por defecto en laravel 5
Podemos verlas en ./proyectoLaravel/database/migrations
2014_10_12_000000_create_users_table.php 2014_10_12_100000_create_password_resets_table.php 2015_05_28_090127_tablaUsuarios.php
- Por su puesto que podemos añadir o quitar (?) campos de estas tablas
- Si lo hacemos debermos de actulizar la clase app/Services/Register-php
- Para modificar en la creación de la tabla deberíamos de modificar el contenido de la clase de la migración 2014_10_12_000000_create_users_table.php antes de ejecutarse, o si no crear una nueva migración con un alter table de la tabla en cuestión para añadir el nuevo campo.
manolo@pitufin:~/instituto/dwesDistancia/empresas/database/migrations$
- Editamos el fichero que ha creado la migración y añadimos los campos que necesitamos en el método up
... public function up(){ Schema::create('usuarios', function($table){ $table->increments('id'); $table->string('password'); $table->string('email'); $table->string('usuario'); $table->timestamps(); $table->rememberToken(); }); } public function down(){ Schema::drop('usuarios'); } *Ahora ejecutamos la migración para que se cree la tabla php artisan migrate *Ahora añadimos el campo para poder recordar el usuario conectado php artisan make:migration tablaUsuarios php artisan migrate:make tablaUsuarios2 *Cargamos lo que queremos que se ejecute en el método up del nuevo fichero creado <source lang=php> .... Schema::table('usuarios', function($tabla){ $tabla->rememberToken(); });
- Ejecutamos la migracion
php artisan migrate
- Y observamos como nos ha creado la tabla con los campos deseados.
- Ahora poblamos la tabla de usuarios y tocaremos un modelo para hacerlo
Creando el modelo
- Si vamos a la carpeta de models, vemos que existe un modelo creado llamado users. Este modelo se ha creado por que está asociado a la clase Auth que a continuación comentaremos. Para personalizar un poco todo y entender mejor el proceso vamos a modificar este modelo y llamarle Usuario y a la tabla asociada al modelo usuarios
- Esto lo hacemos cambiando en el nombre del fichero
/app/Models/User.php lo cambiamos a /app/Models/Usuario.php
- Dentro del fichero donde ponía
... class User extends Eloquent ... ... protected $table = 'users'; ..
- Ponemos
... class Usuario extends Eloquent ... ... protected $table = 'usuarios'; ...
- Ahora que ya tenemos el modelo Usuario con su tabla, que previamente hemos creado vamos a poblarla
Poblando la tabla
- Para ello como ya sabemos en la carpeta seed, cremos una nuevo clase que extienda de Seeder; por ejemplo la llamamos PoblarUsuariosSeeders, y usando el modelo dentro del método run, creamos un nuevo registros
- OBservamos que usamos la clase Hash para cifrar el contenido de la password
class PoblarUsuariosSeeders extends Seeder { //put your code here public function run() { //Usando el modelo creamos un nuevo registro. Tambien se puede hacer con el método save Usuario::create(array( 'usuario' => 'manolo', 'email' => 'admin@admin.com', 'password' => Hash::make('manolo') // Hash::make() nos va generar una cadena con nuestra contraseña encriptada } }
- Para llamar a este método modificamos el método run de la clase DataBaseSeeder.php
... public function run() { Eloquent::unguard(); $this->call('DatosUsuarios'); //Esta es la línea que añadimos } ...
- Ahora ejecutando desde la consola con artisan tendremos el nuevo registro creado
php artisan db:seed
- Verificamos que tenemos el registro creado
Auth.php
Como hemos modificao el modelo, vamos a indicar a la clase de autentificación cual es el modelo que usaremos para autentificar usuarios que sera Usuario
... 'model' => 'Usuario', ... 'table' => 'usuarios',
- De momento no tocamos la gestion de como recordar la password
Preparando las rutas
- Para este ejemplo vamos a tener la siguiente sitiación
- Un usuario solo puede acceder al sitio web si previamente se ha identificado
- Para identificarse usaremos el login que tenemos de la tienda
- Una vez logueado le daremos la opción de desloguearse
- No lo hemos visto anteriormente pero es muy intuitivo, y es el tema de los filtros
- En este caso le estamos diciendo que existen ciertas rutas que solo cargará si el usuario previamente se ha identificado
- Con solo hacer esto no tenemos que validar el usuario ante ninguna acción.
- El código es tan sencillo como
Route::get('/', ['before'=>'auth']
<?php // Nos mostrará el formulario de login. Route::get('login', 'Autentificacion@formularioLogin'); // Validamos los datos de inicio de sesión. Route::post('login', 'Autentificacion@validaLogin'); // Nos indica que las rutas que están dentro de él sólo serán mostradas si antes el usuario se ha autenticado. Route::group(array('before' => 'auth'), function() { // Esta será nuestra ruta de bienvenida. Route::get('/', 'Accion@index'); Route::get('logout', 'Autentificar@logOut'); }); /* Otra forma de escribir lo mismo Route::get('/',['before'=>'auth','uses'=>'Accion@index']); Route::get('/logout',['before'=>'auth','uses'=>'Autentificacion@logout']); */
- Usaremos el formulario usado para la tienda
- Para ello usaremos tienda.css. Este fichero lo debemos copiar en la carpeta
/public/css/tienda.css
- Creando los controladores
php artisan controller:make Autentificacion php artisan controller:make Accion
- Incluimos los métodos especificados en el router.php dentro de los controladores
- muestraLogion()
- En este método queremos mostrar el formulario de login si el usuario no está autentificado, si no simplemente mostramos el formulario para que se loguee.
public function formularioLogin(){ //Si el usuario ya está autentificado directamente vamos a enviarle a la página inicial, y si no mostramos el menu if (Auth::check()){ return Redirect::to('/'); } return View::make('formularioLogin'); }
</source>
- Ahora haremos el vista formularioLogin.blade.php
<!DOCTYPE html> <!-- Desarrollo Web en Entorno Servidor --> <!-- Ejemplo Tienda Web: login.php --> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> {{ HTML::style('css/tienda.css') }} <link href="tienda.css" rel="stylesheet" type="text/css"> <title>Ejemplo Tema 4: Login Tienda Web</title> </head> <body> <div id='error'> {{-- Preguntamos si hay algún mensaje de error y si hay lo mostramos --}} @if(Session::has('mensaje')) {{ Session::get('mensaje') }} @endif </div> <div id='login'> {{ Form::open(array('url'=>'login')) }} <fieldset > <legend>Login</legend> <div class='campo'> {{ Form::label('nombre', 'Nombre de usuario') }} {{ Form::text('nombre', 'Sin nombre') }} </div> <div class='campo'> {{ Form::label('password', 'Password') }} {{ Form::text('password') }} </div> <div class='campo'> {{ Form::submit('validar') }} </div> </fieldset> {{ Form::close() }} </body> </html>
- Vemos como en este caso vamos a consultar a ver si hay un mensaje de error
- Si simplemente accediera al valor de la variable, a diferencia de smarty, aquí sí que me daría un error.
- Como usa css, copiamos el fichero tienda.css, en la carpeta /public/css/tienda.css
- validaLogin
- Este método contiene la validación de nuestro usuario
- Lo que queremos es que si se valida correctamente entremos a una página del sitio, y si no que, vuelva a mostrar la pantalla de validarse, y que me muestre un mensaje de error
- Vemos directamente el código
public function validaLogin(){ // Recuperamos los datos de usuario y password en dos variablesGuardamos en un arreglo los datos del usuario. $usuario = Input::get('nombre'); $pass = Input::get('password'); // Validamos los datos y además mandamos como un segundo parámetro la opción de recordar el usuario. if(Auth::attempt(['usuario'=>$usuario, 'password'=>$pass])){ return Redirect::to('/'); { // En caso de que la autenticación haya fallado manda un mensaje al formulario de login // también regresamos los valores enviados con withInput(). } return Redirect::to('login') ->with('mensaje', 'Los datos son incorrectos') ->withInput(); } }
- Ahora nos queda escribir la plantilla del sitio hello.php en la carpeta de views
- Editamos el fichero ya existente y modificamos el body
.... <body> <div class="welcome"> <h1>Wellcome a tu sitio web {{ Auth::user()->name; }}</h1> <a href="/logout">Salir.</a> </div> </body> </html>
Wellcome a tu sitio web {{ Auth::user()->name; }}
<a href="/logout">Salir.</a>
</body> </html </source>
- logout
- Para terminar nos falta implementar el método logout
/* Volvemos a mostrar el formulario de login indicando que se cerró la sesion */ public function logOut() { Auth::logout(); return Redirect::to('login') ->with('mensaje', 'Tu sesión ha sido cerrada.'); }