@lexstile

Как правильно сделать ограничение на количество сеансов для пользователя на laravel 9?

Под сеансом я имел ввиду активный refresh token.
Хотелось бы установить ограничение на 5 сеансов.

То есть, пользователь залогинился с 5 разных браузеров/устройств и т. д., на 6 логин мы удаляем все предыдущие сессии - в первую очередь refresh tokens, а access все равно потухнут сами через 30 минут, но можно и удалить вручную.

Сейчас это реализовано так, но криво:
namespace App\Listeners;

use App\Models\User;
use Laravel\Passport\Events\AccessTokenCreated;
use Laravel\Passport\Token;
use Laravel\Passport\TokenRepository;
use Laravel\Passport\RefreshTokenRepository;

class RevokeOldTokens
{
    public function handle(AccessTokenCreated $event)
    {
        $accessTokens = Token::query()->where('user_id', $event->userId)->where('revoked', 0)->where('id', '!=', $event->tokenId)->get();

        if(count($accessTokens) >= User::MAX_SEANS) {
            $tokenRepository = app(TokenRepository::class);
            $refreshTokenRepository = app(RefreshTokenRepository::class);
            
            foreach ($accessTokens as $accessToken) {
                $tokenRepository->revokeAccessToken($accessToken->id);
                $refreshTokenRepository->revokeRefreshTokensByAccessTokenId($accessToken->id);
            }
        }
    }
}

class EventServiceProvider extends ServiceProvider
{
    protected $listen = [
        'Laravel\Passport\Events\AccessTokenCreated' => [
            'App\Listeners\RevokeOldTokens',
        ],
        'Laravel\Passport\Events\RefreshTokenCreated' => [
            //'App\Listeners\PruneOldTokens',
        ],
        ProjectCreatedEvent::class => [
            ProjectSlugListener::class,
        ],
    ];
}

Основная проблема: выкидывает из админки периодически - пока не очень понял, почему (такое ощущение, что удаляется что-то лишнее).
Как можно правильно реализовать подобную задачу?
  • Вопрос задан
  • 123 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы