Чтобы ответить на ваш вопрос прямо сейчас, я сначала взгляну на ваше первое правило проверки.Не видя вашу форму, я предполагаю, что у вас есть поле с именем username
.То, что вы делаете в настоящее время, это заполнение значения username
вместо предоставления имени поля.Попробуйте изменить свой запрос следующим образом:
protected function validateLogin(Request $request)
{
$request->validate([
'username' => 'required|string',
'password' => 'required|string',
'type' => new TypeRule
]);
}
Чтобы погрузиться немного глубже, является ли поле type
скрытым полем, передаваемым в форме?Если это так, это представляет потенциальный недостаток безопасности.Я мог бы легко открыть Dev Tools и переключить поле типа на то, что я хотел.Я хотел бы рассмотреть подход к этому, вместо этого сделать промежуточное программное обеспечение по защищенным маршрутам.В этом промежуточном программном обеспечении вы можете проверить тип пользователя - вместо того, чтобы включать его в проверку
Сначала удалите тип из проверки:
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