Session của tôi đâu? Laravel đã xử lý ma giáo với việc đăng nhập như thế nào ?

Tram Ho

1. Đặt vấn đề

Laravel hiện nay là framework PHP được sử dụng nhiều nhất nhờ vào việc dễ sử dụng, xây dựng theo mô hình MVC, các tính năng dựng sẵn, tính năng bảo mật….Và chắc hẳn khi làm việc với Laravel thì hầu như ai cũng đã từng làm qua chức năng đăng nhập.

Đã bao giờ bạn vào core của Laravel xem họ đã so sánh email, password trong database và tạo SESSION như thế nào chưa ?

Khi code thì bạn chỉ cần truyền params ví dụ là emailpassword vào hàm attempt() của Facade Auth là được, kiểu như này:

Chắc hẳn khi làm với PHP thuần thì bạn còn cần phải set SESSION cho nó, kiểu như này:

Ví dụ thôi nhé.  Vậy, chúng ta sẽ thử đi vào tìm hiểu xem Laravel có những gì ẩn sâu bên trong cơ chế login của nó nhé

2. Mày mò

Lướt qua phần config, chúng ta sẽ thấy có một file config/auth.php

Hệ thống xác thực Authentication của Laravel được xây dựng dựa trên 2 thành phần cốt lõi – guard và provider.

Guards

Guard các bạn cứ hiểu như là một cách cung cấp logic được dùng để xác thực người dùng. Trong Laravel, thường hay dùng session guard hoặc token guard. Session guard duy trì trạng thái người dùng trong mỗi lần request bằng cookie. Còn Token guard xác thực người dùng bằng cách kiểm tra token hợp lệ trong mỗi lần request.

Vì vậy, như bạn thấy, guard xác định logic của việc xác thực, và không cần thiết để luôn xác thực bằng cách lấy các thông tin hợp lệ từ phía back-end. Bạn có thể triển khai một guard mà chỉ cần kiểm tra sự có mặt của một thông tin cụ thể trong headers của request và xác thực người dùng dựa trên điều đó.

Provider

Nếu Guards hỗ trợ việc định nghĩa logic để xác thực thì Providers lấy ra dữ liệu người dùng từ phía back-end. Nếu guard yêu cầu người dùng phải hợp lệ với bộ lưu trữ ở back-end thì việc triển khai truy suất người dùng sẽ được providers thực hiện.Laravel hỗ trợ cho việc người dùng truy suất sử dụng EloquentQuery Buider vào database. Tuy nhiên, chúng ta có thể thêm bất kì thay đổi vào . Ví dụ nhé, các bạn đặt model User trong namespace App nữa mà các bạn muốn đặt trong namespace AppModel thì chúng ta sẽ thay đổi providers tronbg file app/auth.php như sau :

Ở bài này sẽ xem laravel xử lý login và lưu session như thế nào nên ở guards web mình để config driversession nên chúng ta sẽ tập trung vào file vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php nhé.

Như đã nói ở đầu bài khi làm chức năng login ta chỉ cần truyền params vào hàm attempt() thì laravel sẽ xử lý cho chúng ta, thế nên tìm hàm attempt() ở class SessionGuard xem nó làm như thế nào.

Đây là hàm chúng ta cần:

$this->fireAttemptEvent($credentials, $remember); đoạn này sẽ được thực hiện khi có event

Tiếp theo là nó sẽ truy xuất thông tin người dùng với các thông tin params truyền vào $this->lastAttempted = $user = $this->provider->retrieveByCredentials($credentials);

Khi này nó gọi hàm retrieveByCredentials()IlluminateContractsAuthUserProvider, chúng ta lại mò vào đây xem hàm này làm gì

Khi mò vào thì mới biết UserProvider chỉ là interface (yaoming), lại mày mò tiếp thì thấy thằng vendor/laravel/framework/src/Illuminate/Auth/EloquentUserProvider.php implements UserProvider thế là cũng biết hàm retrieveByCredentials sẽ làm gì, và đây là kết quả của nó

Như vậy hàm retrieveByCredentials là sẽ là xử lý truy xuất thông tin người dùng với thông tin được truyền vào.

Tiếp theo ở hàm attempt() nếu user trả về là null tức là việc xác thực thất bại thì sẽ trả về false, Nếu trả về user thì :

Nó sẽ xác thực người dùng dựa vào thông tin đã cho, nếu đúng sẽ gọi đến hàm login() với tham số truyền vào là userremember

Rồi ta lại mò xem hàm login() sẽ làm gì ?

Hàm updateSession() sẽ gọi hàm put()migrate() ở file vendor/laravel/framework/src/Illuminate/Session/Store.php, lúc này hàm put sẽ sinh ra cặp key => value trong phiên với key$this->getName()key$id, ở giá trị key thì sẽ là unique.

Hàm migrate sẽ sinh ra 1 session với độ dài là 40 ký tự, bạn có thể vào storage/framework/sessions đếm xem session dài có đúng 40 ký tự không

Túm lại là hàm updateSesssion() sẽ tạo mới hoặc update session cho chúng ta với độ dài session là 40 ký tự.

Khi người dùng click vào remember thì

Hàm ensureRememberTokenIsSet() sẽ kiểm tra xem user đã có remember_token chưa, nếu chưa sẽ sinh ra 1 remember_token lưu tương ứng với user

Hàm queueRecallerCookie() sẽ trả về cookie cho người dùng.

Chốt tộ

  • Lú cái đầu, như vậy mình đã chia sẻ xem cách Laravel thực hiện ma giáo việc nó xử lý đăng nhập, lưu session và chức năng remember_me như thế nào.
  • Dù nó có ma giáo như nào thì cũng đều xây dựng lên từ PHP thuần nên khi bạn dùng chức năng gì của framework cũng nên mày mò xem nó làm như nào để học hỏi họ làm thế nào mà siêu vậy nhé
  • Hi vọng bài tới mình cũng sẽ mày mò về phần nào đó hay ho tiếp theo của Laravel
Chia sẻ bài viết ngay

Nguồn bài viết : Viblo