Nutzer-Authentifizierung mit Laravel 4

14. März 2013 Web-Entwicklung von Eric Kubenka

Nach dem ich vor kurzem meine ersten Erfahrungen mit dem PHP-Framework laravel sammeln konnte war ich von dem Framework schon ein wenig begeistert, da einem viele Aufgaben abgenommen werden und alles recht simpel und gut dokumentiert ist. Doch eine personalisierte “Hello World”-Ausgabe ist die eine Sache, Authentifizierung, Login, Sessionmanagement und Datenbank-Anbindung die andere. Dachte ich. Was kompliziert klingt, ist dank laravel im Handumdrehen gelöst, insofern man sich mit dem Framework auseinandersetzen möchte.

Datenbank-Verbindung einrichten

Da ich mir als Ziel gesetzt habe laravels Bordmittel zur Authentifizierung auszuprobieren, benötigte ich natürlich eine Datenbank. Eine einfache MySQL-Datenbank sollte meinen Ansprüchen gerecht werden. Die Verbindungsdaten werden in der “app\config\database.php”-Datei festgelegt. Folgende Zeilen habe ich dazu in meine entsprechenden Nutzerdaten verändert.

/*
|--------------------------------------------------------------------------
| Default Database Connection Name    
|--------------------------------------------------------------------------    
*/

'default' => 'mysql',

'mysql' => array(
    'driver'    => 'mysql',
    'host'      => 'localhost',
    'database'  => 'l4_test',
    'username'  => 'user',
    'password'  => 'userpw1',
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
),

Die Standard-laravel-Authentifizierung wird in der “app\config\auth.php” definiert und das bereits zur Auslieferung mitgelieferte User-Model bietet die wichtigsten Grundfunktionen. Doch eins fehlt noch. Die Tabelle “users” in der Datenbank wird sich nicht von selbst erstellen, weshalb nun der “knifflige Part” kommt. Zu Beginn muss die Eingabeaufforderung gestartet und in das laravel-Verzeichnis navigiert werden. Dort wird anschließend ein neuer Eintrag in der Migrationstabelle angelegt.

cd C:\xampp-portable\htdocs\l4
php artisan migrate:make createusertable

Nach Ausführung der zwei Zeilen wird im Ordner “app\database\migrations” eine neue Datei angelegt, welche wie folgt angepasst werden sollte. Mit den folgenden Zeilen wird Gebrauch vom Schema-Builder laravels gemacht. Mit diesem Schema-Builder lassen sich einfach und schnell Tabellen anlegen, editieren und löschen. Die Migrationsdatei besteht aus einem up()-Bereich und einem down()-Bereich. Im up()-Bereich werden alle Befehle angegeben, welche beim Migrieren ausgeführt werden sollen. Im Down()-Part wird angegeben, welche Befehle ausgeführt werden, wenn die Migration rückgängig gemacht werden soll.

use Illuminate\Database\Migrations\Migration;

class Adduserstable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function($t) {
            $t->increments('id');
            $t->string('username', 255)->unique();
            $t->string('password', 64);
            $t->string('email');
            $t->string('realname');
            $t->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('users');
    }
}

Um die Migration durchzuführen und damit die Tabelle nach dem oben beschriebenen Schema anzulegen ist es nötig, folgende Zeile in der Eingabeaufforderung auszuführen.

php artisan migrate

Damit auch ein paar Nutzer existieren, mit welchen man ein wenig rumspielen und experimentieren kann reicht es aus, ein paar Datensätze mit Hilfe des DatabaseSeeders zu erstellen. Dazu die Datei “app\database\seeds\DatabaseSeeder.php” wie folgt abändern.

class DatabaseSeeder extends Seeder {
	public function run()
	{
		$this->call('UserTableSeeder');
	}
}

class UserTableSeeder extends Seeder {
    public function run()
    {
        DB::table('users')->delete();
        User::create(array('username' => 'max', 'password' => Hash::make('mypass'), 'realname' => "Max Mustermann", 'email' => 'max.mustermann@mail-example.de'));
		User::create(array('username' => 'eric', 'password' => Hash::make('mypass'), 'realname' => "Eric Mustermann", 'email' => 'eric.mustermann@mail-example.de'));
    }
}

Routen festlegen und die Logik durchführen

Das Grundgerüst steht also schon mal. Fortsetzend habe ich die Routen in der “routes.php” erstellt und wie folgt definiert.

Route::get('/', array('as' => 'home', function()
{
    return View::make('hello');
}));

// Call login Form by calling the LoginController showLoginPage Action
Route::get('/login', array('uses' => 'LoginController@showLoginPage',
                                        'as' => 'login'));

// route the post from login to action validate                                        
Route::post('/login', 'LoginController@validateLogin');

// Logout route, only show, when user is logged in
Route::get('/logout', array('uses' => 'LoginController@logoutUser',
        'as' => 'logout'))->before('auth');

Die entsprechenden Methoden habe ich im “LoginController”, welcher zuerst im Verzeichnis “app\controller” angelegt werden muss, definiert. 

/// Show Loginpage
    public function showLoginPage() {
        return View::make('login.loginform');
    }

    // method to valdiate the login (called from post login route)
    public function validateLogin() {
        $userCredentials = array(
            'username' => Input::get('username'),
            'password' => Input::get('password')
        );
        
        
        // verify user authentication with help auf static class Auth
        // true: redirect to named route home and display successfull-message
        if (Auth::attempt($userCredentials)) {
            return Redirect::route('home')->with('flashLoginSuccessfull', 'Erfolgreich angemeldet');
        }
        
        // false: redirect back to login form and display error
        return Redirect::route('login')->with('flashLoginError', 'Leider gab es einen Fehler bei der Anmeldung. Bitte übersprüfen Sie die angegebenen Nutzerdaten.')
                        ->withInput();
    }

    // Method to log out the user, after logout redirect to home and show the success message
    public function logoutUser() {
        Auth::logout();
        return Redirect::route('home')->with('flashLogoutMessage', 'Sie haben sich erfolgreich abgemeldet.');
    }

View erstellen und laravel beim Arbeiten zusehen

Controller und Datenbank würden nun bereits schon ihre Zwecke erfüllen, jedoch verweise ich momentan noch auf nicht definierte Views, welche noch erstellt werden müssen. Dazu habe ich im Verzeichnis “app\views\layouts” ein neues Master-Template “master.blade.php” erstellt, welches auf Twitter Bootstrap zurückgreift. Dank der “@unless”-Abfrage wird sicher gestellt, dass bereits angemeldeten Benutzern der Logout, statt der Login-Button angezeigt wird. In den Bereich “@yield(‘content’)” werden die Template-Stücke hineingeladen. Ich werde aus Platzgründen nur noch das Home-View(hello.blade.php) ausführlich anzeigen. Das entsprechende Login-Formular sollte für Euch dann eine Leichtigkeit sein.

<div class="navbar navbar-static-top">
    <a href="{'{ URL::route('home') }'}">Home</a>
    @unless (Auth::check())
    <a href="{'{ URL::route('login') }'}">Login</a>
    @endunless @unless (! Auth::check())
    <a href="{'{ URL::route('logout') }'}">Logout</a>
    @endunless
    
    <div class="container">@yield('content')</div>
</div>

hello.blade.php 

@extends('layouts.master')
@section('sidebar')
    @parent
@stop

@section('content')
    @if (Session::has('flashLoginSuccessfull'))
        <div id="flashLoginSuccessfull" class="alert alert-success">{'{ Session::get('flashLoginSuccessfull') }'}</div>
    @endif
    
    @if (Session::has('flashLogoutMessage'))
        <div id="flashLogoutMessage" class="alert alert-success">{'{ Session::get('flashLogoutMessage') }'}</div>
    @endif

    <p>Willkommen auf der Laravel-Testseite von Code Fever</p>
@stop

Fazit: Das Umsetzen einer einfachen und sicheren Authentifizierung ist dank laravel spielend einfach und vor allem sicher. Ich hoffe, dass ich den Weg zum eigenen Login gut erklären konnte. Falls bei Euch Fragen aufkommen, so fühlt Euch frei, diese zu stellen.

Zurück