Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 12.10.2016 16:45:51

Аутентификация по ldap

Добрый день, подскажите, как сделать, следующее:

Проверять логин и пароль пользователя только через 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)

Не в сети

#2 12.10.2016 16:48:45

Re: Аутентификация по ldap

ldap от active directory ?

Не в сети

#3 12.10.2016 16:49:27

Re: Аутентификация по ldap

да

Не в сети

#4 12.10.2016 16:50:13

Re: Аутентификация по ldap

// Что тут должно быть?

ну хотя бы подключись и прочти деревцо... хотя бы найди пользователя по параметрам.

dd(); // тебе в помощь

Изменено hzone (12.10.2016 16:50:45)

Не в сети

#5 12.10.2016 16:54:09

Re: Аутентификация по ldap

Логику авторизации через ldap я понимаю и как читать дерево и пользователя. Я не понимаю, как это реализовать в Laravel.

Не в сети

#6 12.10.2016 16:54:43

Re: Аутентификация по ldap

по User
дублируешь пользователя из дерева к себе (логин/пароль), где пароль ты словил постом и если совпал - создаёшь/апдейтишь пользователя, переписывая всё, что он хранил, ибо на ларе вторичный дубликат копии user-credentials

затем авторизуешь в ларе по пользователю, уже хранящемуся в ларе.

в противном случае даже не создавай запись у себя.

и так всегда - успешная авторизация в дереве тянет оттуда пользователя, и всегда апдейтишь ПЕРЕД авторизацией в ларе, пользователя в этой ларе ОТ ДЕРЕВА.

Изменено hzone (12.10.2016 16:55:52)

Не в сети

#7 12.10.2016 16:58:05

Re: Аутентификация по ldap

при желании можно и package написать, если дашь доступ к дереву извне (можно на какой-нить сторонний контроллер домена).
давно хотел выпендриться с LDAP ))))

Не в сети

#8 12.10.2016 16:59:23

Re: Аутентификация по ldap

+ пока не понятно, нужно ли тянуть из дерева данные пользователя, там хранящиеся... и как собираешься их хранить в ларе.
либо всегда смотреть в дерево за "телефонами" и "номерами комнат"...

Не в сети

#9 12.10.2016 17:04:05

Re: Аутентификация по ldap

к сожалению я не осилил)
зачем дублировать пользователя? мне надо только проверить, что логин и пароль совпадает, и если совпадает, то по логину уже из БД вытащить всю остальную инфу, к примеру так(псевдо код):

$isAuth = ldap_bind(...);
if ($isAuth)
  $user = User::findByLogin($_POST['login']);
else
  редирект на страницу с логином/паролем

Не в сети

#10 12.10.2016 17:30:54

Re: Аутентификация по ldap

alex_alex пишет:

к сожалению я не осилил)
зачем дублировать пользователя? мне надо только проверить, что логин и пароль совпадает, и если совпадает, то по логину уже из БД вытащить всю остальную инфу, к примеру так(псевдо код):

$isAuth = ldap_bind(...);
if ($isAuth)
  $user = User::findByLogin($_POST['login']);
else
  редирект на страницу с логином/паролем

после проверки в дереве чем ты собираешься авторизовать пользователя? пальцем?
лара ничего не знает о лдапе. даже что такое лдап.
следовательно для авторизации НА САЙТЕ надо пользователя создать.
ибо в противном случае лдап-не-лдап, а на сайте пользователь будет гостём всегда, для этого сайта

Не в сети

#11 12.10.2016 17:34:09

Re: Аутентификация по ldap

подумай о такой приятной вещи.

в дереве создаёшь свойство пользователя например is_intranet_user (boolean)

и читаешь его при авторизации в лдап.

если true - берёшь пользователя и оверврайтишь на сайте либо создаёшь нового если нет такого.
этим пользователем ты будешь авторизовать гостя.
это нужно чтобы впоследствии не ломать лару и голову.
тоесть с моими предложениями вызов Auth::check() будет нормально работать и будет нормальная сессия.

если false - удалёяешь и abort(401)

если его нет, то abort(401)

это просто до посинения.

Изменено hzone (12.10.2016 17:38:19)

Не в сети

#12 12.10.2016 17:35:52

Re: Аутентификация по ldap

как вариант, каждый час читать кроном дерево на предмет пользователей и кидать их в бд лары.
и работать от сайта без лдап.
не забывая удалять пользователей, которым доступ закрыли в течении последнего часа.

но этот вариант "грязного чтения" источника не гуд, ибо за безопасность тебе отвечать рублём как минимум, перед начальством.

Изменено hzone (12.10.2016 17:41:48)

Не в сети

#13 12.10.2016 17:44:18

Re: Аутентификация по ldap

кстати а поиск готовых решений ты не использовал
https://github.com/krenor/ldap-auth

Не в сети

#14 12.10.2016 17:51:46

Re: Аутентификация по ldap

hzone пишет:

после проверки в дереве чем ты собираешься авторизовать пользователя? пальцем?
лара ничего не знает о лдапе. даже что такое лдап.
следовательно для авторизации НА САЙТЕ надо пользователя создать.
ибо в противном случае лдап-не-лдап, а на сайте пользователь будет гостём всегда, для этого сайта

Ещё раз, у меня все пользователи есть в БД. От лдап мне только нужна аутентификация и больше ничего
Остальная инфа хранится в БД и я ничего сложного не вижу, чтобы сделать запрос в базу и достать пользователя по его логину.


hzone пишет:

как вариант, каждый час читать кроном дерево на предмет пользователей и кидать их в бд лары.
и работать от сайта без лдап.
не забывая удалять пользователей, которым доступ закрыли в течении последнего часа.

но этот вариант "грязного чтения" источника не гуд, ибо за безопасность тебе отвечать рублём как минимум, перед начальством.

Все верно, но чтобы избежать "грязного чтения", пользователя надо аутентифицировать не в ларе, а по лдпу проверять. На случай того, если его заблокируют, до запуска крона.

вариант читать свойства из лдапа я не могу использовать.


В общем то вопрос у меня не как написать лдап аутентификацию, а как это сделать в рамках ларавеля. Т.е. как написать свой "драйвер" авторизации, а не использовать коробочный.


За ссылку спасибо, посмотрю.

Изменено alex_alex (12.10.2016 17:52:58)

Не в сети

#15 12.10.2016 17:58:16

Re: Аутентификация по ldap

я как сисадмин (бывший) не понимаю, "какого..." у тебя пользователи есть не в одном месте ?
где контроль доступа ?
где безопасность ?
это фунтдаментальная проблема.

авторизовывать нельзя для того чтобы проверить можно ли авторизовываться - так делать не верно!

поэтому и предложил схему создавать/удалять/модифицировать пользователей после проверки в LDAP, чтобы либо авторизовать либо отказать в доступе.

можно в принципе полностью отказаться от App\User в пользу LDAP, но это уже перепил авторизации Laravel

Не в сети

#16 12.10.2016 19:16:24

Re: Аутентификация по ldap

все просто, есть ад, где заведены пользователи, есть некий веб-ресурс, на который обращаются пользователи, и чтобы не заводить пользователей в двух местах, реализована синхронизация пользователей с ад.
на этом веб-ресурсе, есть специфичные поля(атрибуты) для пользователей, у которых нет аналогов в ад. (заводить кастомные поля в ад, нет возможности)

все достаточно безопасно, если пользователя блокируют в ад, то он сразу же не может зайти на сайт, не дожидаясь часовой синхронизации.

hzone пишет:

авторизовывать нельзя для того чтобы проверить можно ли авторизовываться - так делать не верно!

как раз таки, авторизовывать нельзя до тех пор пока пользователь не аутентифицирован, т.е. аутентификация должна проходить не на сайте, а на сервере ад. т.е. аутенифицирует ад, авторизовывает сайт.

Не в сети

#17 17.10.2016 15:03:11

Re: Аутентификация по ldap

Спасибо, ссылка на гитхаб помогла разобраться.

Не в сети

Подвал раздела