所以我试图使用Laravel的自定义过滤器来验证我的用户。我有我的LDAP PHP脚本工作,我基本上已经把它插入到我的自定义过滤器中。然而,我需要将用户在登录屏幕上输入的用户名和密码传递给这个脚本;换句话说,我需要从登录表单中通过我的自定义过滤器这个用户名和密码。
这是我的代码来帮助解释我的问题:
routes.php
Route::group(array('before' => 'ldapTest'), function() {
Route::controller('apps', 'AppController', array(
//named routes here
));
});
过滤器.pp
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
,因此您可以在前过滤器中这样传递它:
array('before' => 'ldapTest:someString')
因此,在过滤器中,$param
将包含someString
,但在您的情况下,我认为这会有点不同,因为您希望接收通过表单提交的用户输入,因此为了获得这些输入,您可以在过滤器的处理程序(闭包)中使用类似的东西:
$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
....
}
在routes.php中,您可以调用:
Route::get('path', array('before' => 'multiParamFilter:p1:p2' ......
注意:它要求您不要在参数值中使用":"(或至少另一个符号)