#php #laravel #authentication
#php #laravel #аутентификация
Вопрос:
Есть ли какой-либо способ разрешить пользователю входить в систему только с одного устройства?
Заранее спасибо
Ответ №1:
Что ж, вам нужно будет проверить в центральном месте, существует ли уже существующий сеанс для пользователя, который в данный момент хочет войти в систему, и если да, удалите все существующие сеансы.
Центральное место, вероятно, будет при входе в систему или внутри промежуточного ПО аутентификации.
Чтобы удалить все существующие сеансы для пользователя, вы можете запустить
DB::table('sessions')->where('user_id', $user->id)->delete();
Вход только с одного устройства, например, с ноутбука
Вероятно, это невозможно, поскольку каждое устройство должно было бы отправлять уникальный идентификатор, чего оно не делает. Например, вашему ноутбуку потребуется отправить уникальный идентификатор в систему Laravel, чтобы ваше приложение Laravel знало, что это ноутбук, с которого происходит вход в систему.
Формы входа обычно принимают только имя пользователя / адрес электронной почты и пароль, поэтому нет уникального свойства для идентификации вашего ноутбука.
Вероятно, вы могли бы проверить наличие пользовательского агента браузера или подобных вещей, но все это поддельно и не гарантирует 100%-ную идентификацию устройства.
Комментарии:
1. Спасибо за быстрый ответ. Я не хочу проверять, вошел ли пользователь уже в систему. Я хочу разрешить пользователю, который может входить в систему только с одного устройства, например, с моего ноутбука.
2. Я обновил свой ответ, чтобы немного рассказать об устройстве.
3. Понял. Большое спасибо
4. Рад помочь. Если бы я мог помочь, не стесняйтесь отмечать этот ответ как решаемый и отмечать мой ответ.
Ответ №2:
Вы можете использовать промежуточное программное обеспечение deviceInspect и проверить user agent (это может быть подделка, как сказал @codedge) и использовать его после авторизации промежуточного программного обеспечения
Как вы можете видеть, пользователь будет аутентифицирован, но маршруты будут защищены устройством
Создание промежуточного программного обеспечения
class DeviceInspect
{
public function handle($request, Closure $next)
{
$user = Auth::user(); //or $request->user()
// TODO get enabled device/s from datebase for $user - by userId
$enabledDevice = "Dalvik/2.2.0 (Linux; U; Android 10.0.1; AM-A89R Build/NMB55D)"; //example
$currentDevice = $request->userAgent(); //or $_SERVER['HTTP_USER_AGENT'];
//it could be fake like codedge said
if ($enabledDevice !== $currentDevice) {
$data = array(
"device" => false,
"message" => "your message to user",
);
return response([$data], 401); // or something else
}
return $next($request);
}
}
добавьте это в App Http Kernel
protected $routeMiddleware = [
...
'device' => 'AppHttpMiddlewareDeviceInspect',
];
и используйте его, как показано ниже
//in controller
class SomeController extends Controller {
public function __construct() {
parent::__construct();
$this->middleware(['auth', "device"]);
}
}
или
//Or in routes
Route::get('/profil', function () {
//
})->middleware(['auth', 'device']);
or
Route::group(['prefix' => '/v1/data', 'namespace' => 'ApiV1', 'as' => 'api.', 'middleware' => ['auth:api', 'device']], function () {
Route::resource('activity', 'DataDataController', ['only' => ['index', 'show']]);
});