Integrasi Login User Dengan LDAP Di Laravel

Ini share pengalaman aja ya dimana sebuah aplikasi butuh integrasi ke sebuah protocol ldap yang dimana aplikasi dibangun dengan menggunakan laravel 5.8, yang di integrasikan yaitu ketika user login nah user profile nya menggunakan login ldap yang dimana LDAP ini biasanya digunakan untuk protocol Active Directory. Untuk memulai projectnya saya harapkan jangan di implementasikan ke project existing tapi kita coba dulu dengan membuat project baru laravelnya supaya tidak mengganggu project yang lain ketika ada error.

Untuk mengetahui apa itu LDAP pengertian LDAP secara lengkap kalian bisa mampir ke artikel saya yang sebelumnya sudah membahas tentang LDAP silahkan kalian kunjungi Link INI , setelah kalian mengerti apa itu LDAP nah kita bisa lanjut ke artikel Laravel LDAP.

Buat Project Laravel Baru

$ composer create-project --prefer-dist laravel/laravel ldap2021 "5.8.*" -vvv

Generate Key Project

$ php artisan key:generate

Koneksikan project ke database, saya disini menggunakan database MySQL

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=ldap2021
DB_USERNAME=root
DB_PASSWORD=

Install Plugin LDAP Record di project laravel anda

$ composer require directorytree/ldaprecord-laravel -vvv

Tunggu proses installasi library ldaprecord nya sampai selesai, dalam kesempatan ini saya menggunakan OpenLDAP yang dimana saya hanya mengetes LDAP Server orang lain. Bisa kalian tambahkan konfigurasi LDAP nya kedalam file environment variable

LDAP_LOGGING=true
LDAP_CONNECTION=default
LDAP_HOST=ldap.forumsys.com
LDAP_USERNAME=null
LDAP_PASSWORD=null
LDAP_PORT=389
LDAP_BASE_DN="dc=example,dc=com"
LDAP_TIMEOUT=5
LDAP_SSL=false
LDAP_TLS=false

Setelah kalian masukan konfigurasi ke environment variable laravel atau .env file, selanjutnya lakukan vendor:publish

vendor-publish

Sebetulnya dalam tahapan ini kita sudah terintegrasi ke LDAP Record, untuk mengetes nya kalian bisa lakukan LDAP Test dengan menjalankan Syntak

$ php artisan ldap:test

Maka output dari syntaknya akan seperti ini :

ldap-test-laravel

Bisa kita lihat bahwa LDAP sudah terkoneksi ke server Openldap nya, sekarang kita akan integrasikan dengan authentikasi laravel login, dalam tahapan ini saya menggunakan make:auth laravel.

$ php artisan make:auth

Rubah schema table user menjadi seperti ini :

    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('guid')->unique()->nullable();
            $table->string('domain')->nullable();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

Jalankan migrate refresh supaya schema table user menjadi schema yang baru dengan ada tambahan 2 column, yaitu guid dan domain.

$ php artisan migrate:refresh --seed

Setelah di tambahkan kita rubah model User.php supaya diimplement ke Library LDAP Record

.......
use LdapRecord\Laravel\Auth\LdapAuthenticatable;
use LdapRecord\Laravel\Auth\AuthenticatesWithLdap;

class User extends Authenticatable implements LdapAuthenticatable
{
    use Notifiable, AuthenticatesWithLdap;
........
}

Karena kita akan mengintegrasikan authentikasi make:auth laravel maka dari itu kita perlu memodifikasi config/auth.php menjadi seperti ini.

......
'guards' => [
        // 'web' => [
        //     'driver' => 'session',
        //     'provider' => 'users',
        // ],
        'web' => [
            'driver' => 'session',
            'provider' => 'ldap',
        ],

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
            'hash' => false,
        ],
    ],

......
    'providers' => [
        'ldap' => [
            'driver' => 'ldap',
            'model' => LdapRecord\Models\OpenLDAP\User::class,
            'database' => [
                'model' => App\User::class,
                'sync_passwords' => false,
                'sync_attributes' => [
                    'name' => 'cn',
                    'email' => 'mail',
                ],
            ],
        ],

Selanjutnya kita juga perlu memodifikasi file app/Http/Controllers/Auth/LoginController.php kurang lebih menjadi seperti ini.

...............
use Illuminate\Http\Request;
.......
    protected function credentials(Request $request)
    {
        return [
            'uid' => $request->get('username'),
            'password' => $request->get('password'),
        ];
    }

    public function username()
    {
        return 'username';
    }
......

Yang terakhir kita perlu memodifikasi view login lavel resources/views/auth/login.blade.php menjadi seperti ini.

......................................
                        <div class="form-group row">
                            <label for="username" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>

                            <div class="col-md-6">
                                <input id="username" type="username" class="form-control @error('username') is-invalid @enderror" name="username" value="{{ old('username') }}" required autocomplete="email" autofocus>

                                @error('email')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>

                            <div class="col-md-6">
                                <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="current-password">

                                @error('password')
                                    <span class="invalid-feedback" role="alert">
                                        <strong>{{ $message }}</strong>
                                    </span>
                                @enderror
                            </div>
                        </div>
...........................................

Untuk menguji usernya kalian bisa test user yang sudah disediakan oleh OpenLDAP bisa dilihat sample usernya di blog sumber untuk usernya kalian bisa test beberapa contoh user.

  • einstein
  • newton
  • galieleo
  • tesla

Dengan default password = password 

test-login-ldap

Demikianlah artikel kali ini, semoga Bermanfaat buat para reader dunia maya.

Related Articles

Comments