Reputation: 59
I try to implement ldap user authentication using the ldaprecord package with Laravel 8. Although user authentication is successful, I cannot access the session when I check it through the middleware.
After Auth::login($user), Auth::check() method returns true, somehow on Auth Middleware it return false. I use file for session_driver. The file is created at storage/framework/sessions successfully, so permissions look okay to me. What should I pay attention to for the session to be permanent?
AuthController.php
class AuthController extends Controller
{
public function getLogin(){
return view('login');
}
public function postLoginForm(Request $request){
$request->validate([
'username' => 'required',
'password' => 'required',
]);
$username = $request->username . "@iegm.local";
$connection = Container::getConnection('default');
if ($connection->auth()->attempt($username, $request->password)) {
$user = User::firstOrCreate(['username' => $request->username], [
'is_admin' => 0,
'is_active' => 1
]);
Auth::login($user);
dd(Auth::check()); // --> return true
return redirect()->route('get.anasayfa');
}
return back()->with('fail', 'basarisiz');
}
public function logout() {
Session::flush();
Auth::logout();
return redirect('login');
}
}
auth.php
<?php
return [
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'ldap',
],
],
'providers' => [
'ldap' => [
'driver' => 'ldap',
'model' => App\Models\LdapUser::class,
],
],
];
Kernel.php
<?php
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\Session\Middleware\AuthenticateSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
// \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
'throttle:api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
]
];
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,
'log' => \App\Http\Middleware\LogMiddleware::class,
];
}
web.php
Route::middleware(['auth'])->group(function () {
Route::get('/', [AnasayfaController::class, 'index'])->name('get.anasayfa');
});
Authenticate.php
<?php
namespace App\Http\Middleware;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
class Authenticate extends Middleware
{
protected function redirectTo($request)
{
dd(Auth::check()) // --> return false
if (! $request->expectsJson()) {
return route('get.login');
}
}
}
RouteServiceProvider.php
<?php
namespace App\Providers;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
public const HOME = '/home';
protected $namespace = 'App\Http\Controllers';
public function boot()
{
$this->configureRateLimiting();
$this->routes(function () {
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
Route::middleware('web')
->namespace($this->namespace)
->group(base_path('routes/web.php'));
});
}
protected function configureRateLimiting()
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip());
});
}
}
Upvotes: 1
Views: 255
Reputation: 59
I'm not sure this is the best approach, but when I used two different models and edited the auth.php
file as follows, the Authenticaion
middleware worked as I expected.
LdapUser.php
<?php
namespace App\Models;
use LdapRecord\Models\Model;
class LdapUser extends Model
{
public static array $objectClasses = ['top', 'person', 'organizationalPerson', 'user'];
}
User.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
protected $fillable = [
'username',
'is_admin',
'is_active'
];
protected $table = 'users';
}
auth.php
'defaults' => [
'guard' => 'web',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
]
],
Upvotes: 1