Quay lại

Đăng xuất khỏi mọi thiết bị ngoại trừ thiết bị hiện đang đăng nhập trong Laravel Chuyên mục PHP và Laravel    2023-07-27    1.1k Lượt xem    88 Lượt thích    comment-3 Created with Sketch Beta. 0 Bình luận

Đăng xuất khỏi mọi thiết bị ngoại trừ thiết bị hiện đang đăng nhập trong Laravel

Mọi ứng dụng web mạnh mẽ đều có tính năng này khi bạn được cung cấp một cài đặt mà qua đó bạn có thể chọn đăng xuất khỏi tất cả các thiết bị mà bạn đã đăng nhập trước đó, ngoại trừ thiết bị hiện tại. Đây chắc chắn là một tính năng bảo mật tuyệt vời mà bạn có thể cung cấp cho người dùng của mình mà không cần họ yêu cầu và nếu ứng dụng của bạn được xây dựng trên Laravel, tính năng này sẽ vượt trội.

Đây là cách bạn có thể thực hiện điều này. Trước hết, bạn cần bỏ ghi chú dòng \Illuminate\Session\Middleware\AuthenticateSession::class từ $middlewareGroups trong file app/Http/Kernel.php vì đây là middleware quản lý phiên người dùng trong Laravel.

/**
 * The application's route middleware groups.
 *
 * @var array
 */
protected $middlewareGroups = [
    'web' => [
        ...
        \Illuminate\Session\Middleware\AuthenticateSession::class,
        ...
    ],
    ...
];

Tiếp theo, bạn có thể sử dụng phương thức logoutOtherDevices trong Facade Auth lấy mật khẩu của người dùng làm đối số duy nhất. Bạn có thể thu thập mật khẩu thông qua một form nhập liệu.

use Illuminate\Support\Facades\Auth;

Auth::logoutOtherDevices($password);

Chỉ đơn giản thế thôi ! Điều này sẽ hoàn thành công việc của bạn là đăng xuất người dùng khỏi tất cả các thiết bị đã đăng nhập đang hoạt động ngoại trừ thiết bị hiện tại.

Tại sao nó lại làm được như thế ?

Bây giờ, hãy xem cách triển khai phương thức logoutOtherDevices mà bạn có thể tìm thấy trong lớp Illuminate\Auth\SessionGuard.

/**
 * Invalidate other sessions for the current user.
 *
 * The application must be using the AuthenticateSession middleware.
 *
 * @param  string  $password
 * @param  string  $attribute
 * @return bool|null
 */
public function logoutOtherDevices($password, $attribute = 'password')
{
    if (! $this->user()) {
        return;
    }

    $result = tap($this->user()->forceFill([
        $attribute => Hash::make($password),
    ]))->save();

    $this->queueRecallerCookie($this->user());

    $this->fireOtherDeviceLogoutEvent($this->user());

    return $result;
}

Hãy chia nhỏ chức năng này để hiểu những gì nó đang làm.

Như bạn có thể thấy, phương thức chấp nhận hai đối số. Mật khẩu đầu tiên là mật khẩu của người dùng đã đăng nhập và mật khẩu thứ hai là tùy chọn thuộc tính có tên là 'password'.

if (! $this->user()) {
    return;
}

Phương thức đầu tiên kiểm tra xem người dùng có đăng nhập hay không. Nếu nó chưa đăng nhập, nó sẽ trả về ngay lập tức và tiếp tục thực hiện nếu không.

$result = tap($this->user()->forceFill([
    $attribute => Hash::make($password),
]))->save();

Phương thức forceFill ở đây bỏ qua mảng $fillable một cách hiệu quả trên User model và sẽ cập nhật model với các cặp khóa-giá trị mảng mà bạn chuyển cho nó, trong trường hợp của chúng ta là 'password'. Sau đó, kết quả sẽ được nắm bắt bằng phương pháp nhấn, sau đó được sử dụng để lưu nó vào mô hình Người dùng.

$this->queueRecallerCookie($this->user());

Sau đó, nó sẽ tạo một cookie cho phiên hiện tại bằng phương thức queueRecallerCookie và xếp nó vào trong cookie.

$this->fireOtherDeviceLogoutEvent($this->user());

Điều này sẽ kích hoạt sự kiện đăng xuất thiết bị khác nếu bộ điều phối được đặt và điều này sẽ làm mất hiệu lực hoàn toàn các phiên khác của người dùng, nghĩa là họ sẽ bị "đăng xuất" khỏi tất cả các bảo vệ mà họ đã được xác thực trước đó. Bạn có thể kiểm tra điều này bằng cách xem triển khai phương thức fireOtherDeviceLogoutEvent.

/**
 * Fire the other device logout event if the dispatcher is set.
 *
 * @param  \Illuminate\Contracts\Auth\Authenticatable  $user
 * @return void
 */
protected function fireOtherDeviceLogoutEvent($user)
{
    if (isset($this->events)) {
        $this->events->dispatch(new Events\OtherDeviceLogout(
            $this->name, $user
        ));
    }
}

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday