Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Добрый день, подскажите, как сделать, следующее:
Проверять логин и пароль пользователя только через ldap, если успешно, то запоминать пользователя на 1 неделю, а данные о пользователе(телефон, должность и т.п.) брать из БД (модели User)?
Насколько я понял, надо написать свой драйвер и зарегистрировать, но я не понимаю, как это сделать.
По сделал следующее:
1. Создал провайдер
namespace App\Providers;
use Auth;
use Illuminate\Support\ServiceProvider;
use Ldap;
class LdapUserProvider extends ServiceProvider
{
public function boot()
{
Auth::extend('ldap', function ($app)
{
return new Ldap(); // Некий класс, который реализует подключение по ldap
});
}
}
2. в файле config\auth.php указал свой драйвер
'providers' => [
'users' => [
'driver' => 'ldap'
],
3. Создал контроллер AuthController.php
namespace App\Http\Controllers;
use Auth;
use Illuminate\Http\Request;
class AuthController extends Controller
{
public function login()
{
return view('auth.login');
}
public function loginProcess(Request $request)
{
// Что тут должно быть?
}
}
А дальше я не понимаю, что надо делать.
Изменено alex_alex (12.10.2016 16:46:30)
Не в сети
ldap от active directory ?
Не в сети
да
Не в сети
// Что тут должно быть?
ну хотя бы подключись и прочти деревцо... хотя бы найди пользователя по параметрам.
dd(); // тебе в помощь
Изменено hzone (12.10.2016 16:50:45)
Не в сети
Логику авторизации через ldap я понимаю и как читать дерево и пользователя. Я не понимаю, как это реализовать в Laravel.
Не в сети
по User
дублируешь пользователя из дерева к себе (логин/пароль), где пароль ты словил постом и если совпал - создаёшь/апдейтишь пользователя, переписывая всё, что он хранил, ибо на ларе вторичный дубликат копии user-credentials
затем авторизуешь в ларе по пользователю, уже хранящемуся в ларе.
в противном случае даже не создавай запись у себя.
и так всегда - успешная авторизация в дереве тянет оттуда пользователя, и всегда апдейтишь ПЕРЕД авторизацией в ларе, пользователя в этой ларе ОТ ДЕРЕВА.
Изменено hzone (12.10.2016 16:55:52)
Не в сети
при желании можно и package написать, если дашь доступ к дереву извне (можно на какой-нить сторонний контроллер домена).
давно хотел выпендриться с LDAP ))))
Не в сети
+ пока не понятно, нужно ли тянуть из дерева данные пользователя, там хранящиеся... и как собираешься их хранить в ларе.
либо всегда смотреть в дерево за "телефонами" и "номерами комнат"...
Не в сети
к сожалению я не осилил)
зачем дублировать пользователя? мне надо только проверить, что логин и пароль совпадает, и если совпадает, то по логину уже из БД вытащить всю остальную инфу, к примеру так(псевдо код):
$isAuth = ldap_bind(...);
if ($isAuth)
$user = User::findByLogin($_POST['login']);
else
редирект на страницу с логином/паролем
Не в сети
к сожалению я не осилил)
зачем дублировать пользователя? мне надо только проверить, что логин и пароль совпадает, и если совпадает, то по логину уже из БД вытащить всю остальную инфу, к примеру так(псевдо код):$isAuth = ldap_bind(...); if ($isAuth) $user = User::findByLogin($_POST['login']); else редирект на страницу с логином/паролем
после проверки в дереве чем ты собираешься авторизовать пользователя? пальцем?
лара ничего не знает о лдапе. даже что такое лдап.
следовательно для авторизации НА САЙТЕ надо пользователя создать.
ибо в противном случае лдап-не-лдап, а на сайте пользователь будет гостём всегда, для этого сайта
Не в сети
подумай о такой приятной вещи.
в дереве создаёшь свойство пользователя например is_intranet_user (boolean)
и читаешь его при авторизации в лдап.
если true - берёшь пользователя и оверврайтишь на сайте либо создаёшь нового если нет такого.
этим пользователем ты будешь авторизовать гостя.
это нужно чтобы впоследствии не ломать лару и голову.
тоесть с моими предложениями вызов Auth::check() будет нормально работать и будет нормальная сессия.
если false - удалёяешь и abort(401)
если его нет, то abort(401)
это просто до посинения.
Изменено hzone (12.10.2016 17:38:19)
Не в сети
как вариант, каждый час читать кроном дерево на предмет пользователей и кидать их в бд лары.
и работать от сайта без лдап.
не забывая удалять пользователей, которым доступ закрыли в течении последнего часа.
но этот вариант "грязного чтения" источника не гуд, ибо за безопасность тебе отвечать рублём как минимум, перед начальством.
Изменено hzone (12.10.2016 17:41:48)
Не в сети
кстати а поиск готовых решений ты не использовал
https://github.com/krenor/ldap-auth
Не в сети
после проверки в дереве чем ты собираешься авторизовать пользователя? пальцем?
лара ничего не знает о лдапе. даже что такое лдап.
следовательно для авторизации НА САЙТЕ надо пользователя создать.
ибо в противном случае лдап-не-лдап, а на сайте пользователь будет гостём всегда, для этого сайта
Ещё раз, у меня все пользователи есть в БД. От лдап мне только нужна аутентификация и больше ничего
Остальная инфа хранится в БД и я ничего сложного не вижу, чтобы сделать запрос в базу и достать пользователя по его логину.
как вариант, каждый час читать кроном дерево на предмет пользователей и кидать их в бд лары.
и работать от сайта без лдап.
не забывая удалять пользователей, которым доступ закрыли в течении последнего часа.но этот вариант "грязного чтения" источника не гуд, ибо за безопасность тебе отвечать рублём как минимум, перед начальством.
Все верно, но чтобы избежать "грязного чтения", пользователя надо аутентифицировать не в ларе, а по лдпу проверять. На случай того, если его заблокируют, до запуска крона.
вариант читать свойства из лдапа я не могу использовать.
В общем то вопрос у меня не как написать лдап аутентификацию, а как это сделать в рамках ларавеля. Т.е. как написать свой "драйвер" авторизации, а не использовать коробочный.
За ссылку спасибо, посмотрю.
Изменено alex_alex (12.10.2016 17:52:58)
Не в сети
я как сисадмин (бывший) не понимаю, "какого..." у тебя пользователи есть не в одном месте ?
где контроль доступа ?
где безопасность ?
это фунтдаментальная проблема.
авторизовывать нельзя для того чтобы проверить можно ли авторизовываться - так делать не верно!
поэтому и предложил схему создавать/удалять/модифицировать пользователей после проверки в LDAP, чтобы либо авторизовать либо отказать в доступе.
можно в принципе полностью отказаться от App\User в пользу LDAP, но это уже перепил авторизации Laravel
Не в сети
все просто, есть ад, где заведены пользователи, есть некий веб-ресурс, на который обращаются пользователи, и чтобы не заводить пользователей в двух местах, реализована синхронизация пользователей с ад.
на этом веб-ресурсе, есть специфичные поля(атрибуты) для пользователей, у которых нет аналогов в ад. (заводить кастомные поля в ад, нет возможности)
все достаточно безопасно, если пользователя блокируют в ад, то он сразу же не может зайти на сайт, не дожидаясь часовой синхронизации.
авторизовывать нельзя для того чтобы проверить можно ли авторизовываться - так делать не верно!
как раз таки, авторизовывать нельзя до тех пор пока пользователь не аутентифицирован, т.е. аутентификация должна проходить не на сайте, а на сервере ад. т.е. аутенифицирует ад, авторизовывает сайт.
Не в сети
Спасибо, ссылка на гитхаб помогла разобраться.
Не в сети
Страницы 1