へっぽこインフラエンジニアのブログ

IT業界の最底辺からこんにちは

【Laravel】ADアカウントでログインできるようにする

参考:LaravelでAD認証を導入する - Qiita

検証時のバージョン

OS:Amazon Linux 2
Apahe:2.4
MariaDB:5.5.64
PHP:7.3
Laravel:7.27.0
Adldap2-laravel:6.1.1

プロジェクト作成

sudo chown ec2-user:ec2-user /var/www/html
cd /var/www/html
composer create-project laravel/laravel [project-name] --prefer-dist

プロジェクトフォルダ内のパーミッション変更

※Laravelが普通に動くパーミッションであれば、なんでもよいです。
参考:CentOS/Apache/Laravel使用時のpermission設定方法 - Qiita

データベース作成

mysql -u root -p
create database laravel;
exit;

DB接続情報の追加

・.env

DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=設定したパスワード

Laravelプロジェクトの日本語化

・config/app.php

'timezone' => 'Asia/Tokyo',
'locale' => 'ja',

DBマイグレーションエラー対策

※MariaDBのバージョンが新しい場合は不要
・app/Providers/AppServiceProvider.php

use Illuminate\Support\Facades\Schema; ←追加
・・・
public function boot()
{
    Schema::defaultStringLength(191); ←追加
}

マイグレーションファイルの編集

・database/migrations/2014_10_12_000000_create_users_table.php

  $table->id();
  $table->string('name');
+ $table->string('username')->unique();
- $table->string('email')->unique();
+ $table->string('email')->nullable();
- $table->timestamp('email_verified_at')->nullable();
  $table->string('password');
  $table->rememberToken();
  $table->timestamps();

・database/migrations/2014_10_12_100000_create_password_resets_table.php は削除する

マイグレーション実行

php artisan migrate

nodejsインストール

php artisan migrate
curl -sL https://rpm.nodesource.com/setup_12.x | sudo bash -
sudo yum install -y nodejs
npm -v

ログイン機能導入

composer require laravel/ui
php artisan ui vue --auth
npm install
npm run dev

PHP-LDAPの導入

sudo yum install -y php-ldap
sudo vi /etc/php.ini

以下を追記する

extension=ldap.so

PHPを再起動する

sudo systemctl restart php-fpm

Adldap2の導入

composer require adldap2/adldap2-laravel

・config/app.php

  'providers' => [
  ・・・
+     Adldap\Laravel\AdldapServiceProvider::class,
+     Adldap\Laravel\AdldapAuthServiceProvider::class,
  ],
  
  'aliases' => [
  ・・・
+     'Adldap' => Adldap\Laravel\Facades\Adldap::class,
  ],

Adldap2設定ファイルのパブリッシュ

php artisan vendor:publish --provider "Adldap\Laravel\AdldapServiceProvider"
php artisan vendor:publish --provider="Adldap\Laravel\AdldapAuthServiceProvider"

ldapサーバの接続設定

・config/ldap.php

'account_suffix' => env('LDAP_ACCOUNT_SUFFIX', '@example.co.jp'),
'hosts' => explode(' ', env('LDAP_HOSTS', dc1.example.co.jp dc2.example.co.jp')),
'base_dn' => env('LDAP_BASE_DN', 'dc=example,dc=co,dc=jp'),
'username' => env('LDAP_USERNAME', 'example\ldap-admin'),
'password' => env('LDAP_PASSWORD', 'password'),

※ユーザ作成/パスワード変更を実装する場合は以下も設定

'use_tls' => env('LDAP_USE_TLS', true),

ログイン周りの修正

・app/Http/Controllers/Auth/LoginController.php

  class LoginController extends Controller
  {
  ・・・
+     public function username()
+     {
+        return 'username';
+     }
  }

・config/auth.php

  'providers' => [
    'users' => [
-       'driver' => 'eloquent',
+       'driver' => 'ldap',

・resources/views/auth/login.blade.php
変更前

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

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

変更後

<div class="form-group row">
    <label for="username" class="col-md-4 col-form-label text-md-right">Username</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="username" autofocus>
        @error('username')

・config/ldap_auth.php
※以下を編集

  'ldap' => [
      'locate_users_by' => 'samaccountname',
      'bind_users_by' => 'samaccountname',
  ],

  'database' => [
      'guid_column' => 'email',
      'username_column' => 'username',
  ],

  'sync_attributes' => [
      'email' => 'mail',
+     'username' => 'samaccountname',
      'name' => 'cn',
  ],

ルート編集

・routes/web.php

Auth::routes();

↑を

Auth::routes([
    'reset' => false,
    'verify' => false,
    'register' => false,
]);

↑に変更する

Welcomeページから「Registerボタン」が、
Loginページから「パスワード忘れリンク」が消える。

ログインを試してみる