Laravel — вход только с одного устройства

#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']]);
});