Implemented caching of our base_dn
This commit is contained in:
parent
210793e814
commit
413f1ec065
@ -2,10 +2,11 @@
|
|||||||
|
|
||||||
namespace App\Classes\LDAP;
|
namespace App\Classes\LDAP;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
use Exception;
|
use Exception;
|
||||||
use Illuminate\Support\Arr;
|
use Illuminate\Support\Arr;
|
||||||
use Illuminate\Support\Facades\Cache;
|
use Illuminate\Support\Facades\Cache;
|
||||||
|
use Illuminate\Support\Facades\Config;
|
||||||
use LdapRecord\Models\Model;
|
use LdapRecord\Models\Model;
|
||||||
use LdapRecord\Query\Collection;
|
use LdapRecord\Query\Collection;
|
||||||
use LdapRecord\Query\Model\Builder;
|
use LdapRecord\Query\Model\Builder;
|
||||||
@ -24,6 +25,7 @@ class Server
|
|||||||
{
|
{
|
||||||
return ($x=(new Entry)
|
return ($x=(new Entry)
|
||||||
->query()
|
->query()
|
||||||
|
->cache(Carbon::now()->addSeconds(Config::get('ldap.cache.time')))
|
||||||
->select(['*','hassubordinates'])
|
->select(['*','hassubordinates'])
|
||||||
->setDn($dn)
|
->setDn($dn)
|
||||||
->listing()
|
->listing()
|
||||||
@ -41,6 +43,7 @@ class Server
|
|||||||
{
|
{
|
||||||
return ($x=(new Entry)
|
return ($x=(new Entry)
|
||||||
->query()
|
->query()
|
||||||
|
->cache(Carbon::now()->addSeconds(Config::get('ldap.cache.time')))
|
||||||
->select($attrs)
|
->select($attrs)
|
||||||
->find($dn)) ? $x : NULL;
|
->find($dn)) ? $x : NULL;
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ class HomeController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function home()
|
public function home()
|
||||||
{
|
{
|
||||||
$base = (new Entry)->baseDN() ?: collect();
|
$base = (new Entry)->baseDNs() ?: collect();
|
||||||
|
|
||||||
return view('home')
|
return view('home')
|
||||||
->with('server',config('ldap.connections.default.name'))
|
->with('server',config('ldap.connections.default.name'))
|
||||||
|
@ -2,8 +2,11 @@
|
|||||||
|
|
||||||
namespace App\Ldap;
|
namespace App\Ldap;
|
||||||
|
|
||||||
|
use Carbon\Carbon;
|
||||||
use Illuminate\Support\Arr;
|
use Illuminate\Support\Arr;
|
||||||
use Illuminate\Support\Collection;
|
use Illuminate\Support\Collection;
|
||||||
|
use Illuminate\Support\Facades\Config;
|
||||||
|
use LdapRecord\LdapRecordException;
|
||||||
use LdapRecord\Models\Model;
|
use LdapRecord\Models\Model;
|
||||||
use LdapRecord\Query\ObjectNotFoundException;
|
use LdapRecord\Query\ObjectNotFoundException;
|
||||||
|
|
||||||
@ -41,18 +44,33 @@ class Entry extends Model
|
|||||||
* @throws ObjectNotFoundException
|
* @throws ObjectNotFoundException
|
||||||
* @testedin GetBaseDNTest::testBaseDNExists();
|
* @testedin GetBaseDNTest::testBaseDNExists();
|
||||||
*/
|
*/
|
||||||
public static function baseDN($connection = NULL): ?Collection
|
public static function baseDNs($connection = NULL): ?Collection
|
||||||
{
|
{
|
||||||
$base = static::on($connection ?? (new static)->getConnectionName())
|
$cachetime = Carbon::now()->addSeconds(Config::get('ldap.cache.time'));
|
||||||
->in(NULL)
|
|
||||||
->read()
|
|
||||||
->select(['namingcontexts'])
|
|
||||||
->whereHas('objectclass')
|
|
||||||
->firstOrFail();
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
$base = static::on($connection ?? (new static)->getConnectionName())
|
||||||
|
->cache($cachetime)
|
||||||
|
->in(NULL)
|
||||||
|
->read()
|
||||||
|
->select(['namingcontexts'])
|
||||||
|
->whereHas('objectclass')
|
||||||
|
->firstOrFail();
|
||||||
|
|
||||||
|
// If we cannot get to our LDAP server we'll head straight to the error page
|
||||||
|
} catch (LdapRecordException $e) {
|
||||||
|
abort(597,$e->getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @note While we are caching our baseDNs, it seems if we have more than 1,
|
||||||
|
* our caching doesnt generate a hit on a subsequent call to this function (before the cache expires).
|
||||||
|
* IE: If we have 5 baseDNs, it takes 5 calls to this function to case them all.
|
||||||
|
* @todo Possibly a bug wtih ldaprecord, so need to investigate
|
||||||
|
*/
|
||||||
$result = collect();
|
$result = collect();
|
||||||
foreach ($base->namingcontexts as $dn) {
|
foreach ($base->namingcontexts as $dn) {
|
||||||
$result->push((new self)->findOrFail($dn));
|
$result->push((new self)->cache($cachetime)->findOrFail($dn));
|
||||||
}
|
}
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
|
@ -69,6 +69,7 @@ return [
|
|||||||
'cache' => [
|
'cache' => [
|
||||||
'enabled' => env('LDAP_CACHE', false),
|
'enabled' => env('LDAP_CACHE', false),
|
||||||
'driver' => env('CACHE_DRIVER', 'file'),
|
'driver' => env('CACHE_DRIVER', 'file'),
|
||||||
|
'time' => env('LDAP_CACHE_TIME',5*60), // Seconds
|
||||||
],
|
],
|
||||||
|
|
||||||
];
|
];
|
||||||
|
56
resources/themes/architect/views/layouts/error.blade.php
Normal file
56
resources/themes/architect/views/layouts/error.blade.php
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
@section('htmlheader')
|
||||||
|
@include('architect::layouts.partials.htmlheader')
|
||||||
|
@show
|
||||||
|
|
||||||
|
<body class="hold-transition error-page">
|
||||||
|
<div id="app">
|
||||||
|
<!-- /.login-logo -->
|
||||||
|
<div class="app-container app-theme-white body-tabs-shadow">
|
||||||
|
<div class="app-container">
|
||||||
|
<div class="h-100 bg-animation">
|
||||||
|
<div class="d-flex h-100 justify-content-center align-items-center">
|
||||||
|
<div class="mx-auto app-login-box col-md-8">
|
||||||
|
|
||||||
|
<div class="modal-dialog w-100 mx-auto">
|
||||||
|
<div class="modal-content">
|
||||||
|
|
||||||
|
<div class="modal-header">
|
||||||
|
<div class="app-logo"><img class="w-50" src="{{ url('img/logo-h-lg.png') }}"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-body">
|
||||||
|
<div class="text-center">
|
||||||
|
<span class="badge badge-danger fsize-2 mb-3 ">@yield('error')</span>
|
||||||
|
</div>
|
||||||
|
<table class="table">
|
||||||
|
<tr>
|
||||||
|
<th>Configuration</th>
|
||||||
|
<td>{{ $x=config('ldap.default') }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>Host</th>
|
||||||
|
<td>{{ ($y=collect(config('ldap.connections.'.$x.'.hosts')))->join(',') }} (IP: <strong>{!! $y->transform(function($item) { return collect(dns_get_record($item))->transform(function($item) { return Arr::get($item,'ip',Arr::get($item,'ipv6')); })->filter()->join('</strong>,<strong>'); })->join(',') !!}</strong>)</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>Port</th>
|
||||||
|
<td>{{ config('ldap.connections.'.$x.'.port') }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th>Message</th>
|
||||||
|
<td>@yield('content')</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
9
resources/views/errors/597.blade.php
Normal file
9
resources/views/errors/597.blade.php
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
@extends('architect::layouts.error')
|
||||||
|
|
||||||
|
@section('error')
|
||||||
|
@lang('LDAP Server Unavailable')
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
{{ $exception->getMessage() }}
|
||||||
|
@endsection
|
Loading…
Reference in New Issue
Block a user