如何在Laravel中显示自定义登录验证

时间:2019-05-04 11:44:47

标签: laravel laravel-5.7

如何在登录页面中显示自定义验证。我有一种用户。如果特定的用户类型未登录,则显示错误消息。我有一个登录表单,其中允许特定类型的用户登录。例如,如果允许subscriber类型的用户登录。如果另一个user类型的用户尝试登录,则应显示一个错误消息,指出仅允许订户登录。

protected function validateLogin(Request $request)
{
    $request->validate([
        $this->username() => 'required|string',
        'password' => 'required|string',
        'type' => new TypeRule
    ]);
}

TypeRule

class TypeRule implements Rule
{
    public function passes($attribute, $value)
    {
        return $value === 'subscriber' || $value === 'admin';
    }

    public function message()
    {
        return ':attribute subsciber is allowed to login';
    }
}

当前,规则未根据要求进行验证。如果未输入电子邮件或密码,则不会显示错误消息。

1 个答案:

答案 0 :(得分:0)

为直接回答您的问题,我首先看一下您的第一个验证规则。在不查看您的表单的情况下,我将假设您有一个名为username的字段。您当前正在做的是填充username的值,而不是提供字段名称。尝试将您的请求更改为此:

protected function validateLogin(Request $request)
{
    $request->validate([
        'username' => 'required|string',
        'password' => 'required|string',
        'type' => new TypeRule
    ]);
}

要深入探讨,字段type是否在表单上传递了隐藏字段?如果是这样,则表示存在潜在的安全漏洞。我可以轻松地打开“开发工具”并将“类型”字段切换为我想要的任何类型。我会考虑通过在受保护的路由上制作中间件来解决此问题。在此中间件中,您可以检查用户的类型-而不是将其包括在验​​证中

首先,从验证中删除类型:

protected function validateLogin(Request $request)
{
    $request->validate([
        'username' => 'required|string',
        'password' => 'required|string'
    ]);

    if (auth()->attempt(['email' => $request->input('username'), 'password' => $request->input('password')])) {
        return redirect('/dashboard');
    }

    return redirect()->back();
}

然后,通过运行以下命令来创建新的中间件:

$ php artisan make:middleware IsSubscriber

现在,打开在app/Http/Middleware/IsSubscriber.php创建的文件并添加检查以查看当前经过身份验证的用户是否为subscriber类型

namespace App\Http\Middleware;

use Closure;

class IsSubscriber
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (auth()->user()->type !== 'subscriber') {
            return abort(403, 'The user is not a subscriber, therefore cannot log in.');
        }
        return $next($request);
    }
}

然后,您需要在App\Http\Kernel.php文件中注册中间件:

protected $routeMiddleware = [
    'subscriber' => App\Http\Middleware\IsSubscriber::class,
];

最后,将中间件添加到您的路由web.php文件中-我将假设一些简单的路由:

Route::group(['middleware' => ['subscriber']], function(){

    Route::get('/dashboard', function () {
        return view('dashboard');
    });

});

不要忘记运行:

$ composer dump-autoload
$ php artisan optimize:clear