Ön Hazırlık

Yukarıda bahsettiğim gibi Lumen Laravel'in bir çok katmandan arındırılmış halidir. Kullanıcı doğrulamasını sağlayabilmek için bu katmandan birkaçını tekrar eklememiz gerekmekte.

Bunun için app/bootstrap.php içerisinde yorum satırı içerisinde bulunan birçok özelliği tekrar devreye alacağız ve aslına bakılırsa işimizin çoğuda bundan ibaret olacak..

Ortam Değişkenleri

Ortam değişkenlerini(environment variables) benim gibi kullanmayı seviyorsanız yorum satırını kaldırarak işe başlayabiliriz.

// Dotenv::load(__DIR__.'/../');
Dotenv::load(__DIR__.'/../');

Sonrasında Lumen dizinine .env.example dosyasının ismini değiştirerek .env yapalım. Bu dosya içerisinde gerekli alanları değiştirebilirsiniz.En basit haliyle;

APP_ENV=production
APP_DEBUG=false
APP_KEY=n14g08v8uxO6QQ6AcuEgz38vH17Ib1Jq

APP_LOCALE=en
APP_FALLBACK_LOCALE=en

DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret

CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=database

Facade'lar ve Elequent

Ben uygulamamda Laravel'in facade'larını kullanmayı tercih ediyorum. Bu yüzden yine bootstrap.php dosyamızdan facade'lar ile ilgili yorum satırını kaldıracağız. Bunun yanında elequent'ın gücünden yararlanmak için elequent yorum satırınıda kaldıralım.

// $app->withFacades();

// $app->withEloquent();
$app->withFacades();

$app->withEloquent();

Middleware'ler

Middleware'ler her bir istekten önce çalışabileceği belirlenen route'larda da çalışabilmektedir. Uygulamamızdaki amaç kullanıcı doğrulaması olduğu için hali hazırda bulunan Session ve Cookie middlewarelerine ihtiyacımız olacak. Bunun için aşağıdaki middleware satırlarını değiştirelim. Bu middleware'ler global middleware olarak her bir istekte çalışacaktır.

// $app->middleware([
//     // Illuminate\Cookie\Middleware\EncryptCookies::class,
//     // Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
//     // Illuminate\Session\Middleware\StartSession::class,
//     // Illuminate\View\Middleware\ShareErrorsFromSession::class,
//     // Laravel\Lumen\Http\Middleware\VerifyCsrfToken::class,
// ]);
$app->middleware([
//     // Illuminate\Cookie\Middleware\EncryptCookies::class,
				Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
       Illuminate\Session\Middleware\StartSession::class,
//     // Illuminate\View\Middleware\ShareErrorsFromSession::class,
//     // Laravel\Lumen\Http\Middleware\VerifyCsrfToken::class,
]);

Son olarak route'larımızda kullanıcı doğrulamasını sağlayabilmemiz için kendi middleware'imizi ekleyelim. Henüz bu dosyayı oluşturmadığımızı unutmayalım.

// $app->routeMiddleware([

// ]);
$app->routeMiddleware([
    'auth' => 'App\Http\Middleware\Authentication'
]);

Middleware'imiz

Biraz önce bahsettiğimiz middleware'imizi App\Http\Middleware\Authentication.php* olarak oluşturalım.

<?php 

namespace App\Http\Middleware;

class Authentication {
    public function handle($request, $next)
    {
        if (!\Auth::check()) {
            return redirect('login');
        }

        return $next($request);
    }

}

Kimlik Doğrulama

Artık uygulamamız için kimlik doğrulama sistemini yazmamız için hazır.

Kullanıcı Modeli

İlk olarak kullanıcı modelimiz ile başlayalım.



<?php
# /app/User.php
namespace App;

use Illuminate\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Auth\Passwords\CanResetPassword;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;

class User extends Model implements AuthenticatableContract, CanResetPasswordContract {
	use Authenticatable, CanResetPassword;
	protected $fillable = ['name', 'email', 'password', 'answered', 'score'];
	protected $hidden = ['password', 'remember_token'];
}

Migrationlar

Maalesef Laravel'de olduğu gibi hazır migrationlarımız gelmiyor ama Laravel migrationlarını kopyalamamızda bir sakınca yok.

<?php
# /database/migrations/2014_10_12_000000_create_users_table.php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password', 60);
            $table->rememberToken();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('users');
    }
}
<?php
# /database/migrations/2014_10_12_100000_create_password_resets_table.php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password', 60);
            $table->rememberToken();
            $table->timestamps();
        });
    }

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

Sonrasında migrationlarımızı çalıştıralım.

php artisan migrate

Seedler

Deneme amacıyla bir kullanıcı oluşturmamızda yarar var.

<?php
# /database/seeds/UserTableSeeder.php
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
use App\User;
class UserTableSeeder extends Seeder {
     public function run()
     {
         User::create([
             'name' => 'Hakan ERSU',
             'email' => 'admin@admin.com',
             'password' => Hash::make('123456')
         ]);
        
    }
}

Sonrasında /database/seeds/DatabaseSeeder.php içerisindeki UserTableSeeder daki yorum satırını kaldıralım.

// $this->call('UserTableSeeder');
$this->call('UserTableSeeder');

Artık seedimizi çalıştırmaya hazırız.

php artisan db:seed

Controller

Artık neredeyse sonra geldik. Controller'ı oldukça basit tutacağım, giriş ve kayıt viewlerinide size bırakıyorum

UsersController adlı bir controller oluşturalım.

<?php 
# app/Http/Controllers/UsersController.php
namespace App\Http\Controllers;

use App\User;

class UsersController extends Controller {

    public function getLogin() {
        $message = \Session::get('message');
        return view('login', ['message' => $message]);
    }
    
    public function postLogin() {
        $email = \Request::input('email');
        $password = \Request::input('password');
        if (\Auth::attempt(['email' => $email, 'password' => $password])) {
            return redirect('/add');
        } else {
            return redirect('login')->with('message', 'Login failed');
        }
    }

    public function getLogout() {
        \Auth::logout();
        return redirect('/');
    }
}