如何在登录页面中显示自定义验证。我有一种用户。如果特定的用户类型未登录,则显示错误消息。我有一个登录表单,其中允许特定类型的用户登录。例如,如果允许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';
}
}
当前,规则未根据要求进行验证。如果未输入电子邮件或密码,则不会显示错误消息。
答案 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