Laravel 5 - 如何使用用户名代替电子邮件进行基本身份验证?

问题描述 投票:0回答:4

大家好!

所以在 Laravel 4 中我们可以做到

Route::filter('auth.basic', function()
{
    return Auth::basic('username');
});

但现在这是不可能的,而且医生也没有给出如何做的线索。那么有人可以帮忙吗?

谢谢!

laravel laravel-5 basic-authentication laravel-middleware
4个回答
10
投票

使用与默认中间件相同的代码创建一个新的自定义中间件:

https://github.com/laravel/framework/blob/5.0/src/Illuminate/Auth/Middleware/AuthenticateWithBasicAuth.php

并覆盖默认的“电子邮件”字段,例如:

return $this->auth->basic('username') ?: $next($request);

7
投票

使用 Laravel 5.7,handle 方法如下所示:

/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @param  string|null  $guard
 * @param  string|null  $field
 * @return mixed
 */
public function handle($request, Closure $next, $guard = null, $field = null)
{
    return $this->auth->guard($guard)->basic($field ?: 'email') ?: $next($request);
}

如果您查看函数定义,可以指定

$field
值。

根据Laravel的文档你可以提供中间件参数:

定义路由时可以指定中间件参数,中间件名称和参数之间用:分隔。多个参数应以逗号分隔:

使用以下内容,我可以指定要在基本身份验证中使用的字段:

Route::middleware('auth.basic:,username')->get('/<route>', 'MyController@action');

:,username
语法可能有点令人困惑。但如果你看一下函数定义:

public function handle($request, Closure $next, $guard = null, $field = null)

您会注意到

$next
后面有两个参数。默认情况下,
$guard
null
,我希望它保持为空/空,所以我省略了该值并提供一个空字符串。下一个参数(如文档所述,用逗号分隔)是
$field
我想用于基本身份验证。


0
投票

我现在用的就是这个

class AuthenticateOnceWithBasicAuth
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return Auth::onceBasic('username') ?: $next($request);
    }
}

-1
投票

您不必复制所有代码:您也可以将其直接添加到路线中,如下所示:

'auth.basic:,username'
。然后,基本身份验证将使用用户名而不是电子邮件。所以,你最终会得到这样的结果:
Route::middleware('auth.basic:,username')

© www.soinside.com 2019 - 2024. All rights reserved.