Поэтому я пытаюсь аутентифицировать моего пользователя с помощью пользовательских фильтров Laravel. У меня работает скрипт PHP LDAP, и я по сути подключил его к своему пользовательскому фильтру. Однако мне нужно передать этому сценарию имя пользователя и пароль, которые пользователь вводит на экране входа в систему; Другими словами, мне нужно передать свой пользовательский фильтр это имя пользователя и пароль из формы входа.
Вот мой код, чтобы помочь объяснить мою проблему:
routes.php
Route::group(array('before' => 'ldapTest'), function() {
Route::controller('apps', 'AppController', array(
//named routes here
));
});
filters.php
Route::filter('ldapTest', function()
{
$username = //how do I get this?
$password = //how do I get this?
//LDAP logic goes here; assume $ldapConn and $userDN are properly initialized
$userBind = @ldap_bind($ldapConn, $userDN, $password);
if($userBind)
{
Auth::login(//what goes here? I want to access $username later on in applications);
return Redirect::to('apps/home');
}
else
{
echo 'Incorrect password';
}
});
Читая документацию, я понимаю, что вы можете передавать параметры в виде строк в фильтры следующим образом: Route::filter('ldapTest:400', function()
, но я не понимаю, как я мог бы использовать это для передачи моего имени пользователя и пароля, используя то, что я предполагаю, будет Input :: get ().
Как я могу это сделать?
На самом деле вы можете передавать параметры в свой пользовательский фильтр, и в этом случае ваш фильтр должен выглядеть следующим образом:
Route::filter('ldapTest', function($route, $request, $param){
//...
});
В вашем Closure
третий аргумент получит параметр, который вы передали, и это $param
Таким образом, вы можете передать его в свой фильтр before:
array('before' => 'ldapTest:someString')
Итак, в фильтре $param
будет содержать someString
но в вашем случае это будет немного по-другому, я думаю, потому что вы хотите получать пользовательские входные данные, отправленные через форму, чтобы получить эти входные данные, вы можете использовать что-то подобное в обработчике вашего фильтра (Closure):
$username = $request->get('username'); // Assumed that username is a form field
$password = $request->get('password');
Также вы можете использовать Input::get('username')
вместо $request
если вы хотите, но это будет работать с $request
переменная экземпляра, и я бы предпочел это использовать.
У меня была похожая потребность в моем проекте, решенная с помощью этого (не очень элегантного, но работающего) обходного пути:
Route::filter('multiParamFilter', function($route, $request, $params){
list($p1, $p2) = explode(':', $params);
//Now you have $p1 and $p2 initialized with parameters
....
}
В rout.php вы можете позвонить:
Route::get('path', array('before' => 'multiParamFilter:p1:p2' ......
Примечание: требуется, чтобы вы не использовали ‘:’ (или хотя бы другой символ) в значениях вашего параметра