Tìm hiểu về Authentication trong Laravel
https://viblo.asia/p/tim-hieu-ve-authentication-trong-laravel-Ljy5VoG3Kra
Mặc định thì php artisan make:auth không có
Tìm hiểu về Authentication trong Laravel
Xin chào anh em, như anh em cũng biết là một hệ thống nào cũng cần có xác thực khi thực hiện một hoặc nhiều hành vi mà hệ thống cho phép. Để tiếp tục series Laravel và những điều thú vị thì hôm nay mình sẽ giới thiệu với các bạn Authentication
trong Laravel - nó xây dựng giúp cho việc thực hiện xác thực vô cùng đơn giản. Bạn sẽ không ngờ được là Laravel nó xây dựng sẵn, chúng ta chỉ việc dùng và tùy ý theo chúng ta muốn mà thôi. Nào chúng ta hãy bắt tay đi tìm hiểu nó thôi.
1. Giới thiệu
Lướt qua phần config tí nhé, 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 đó.
Providers
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 Eloquent và Query 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 App\Model thì chúng ta sẽ thay đỏi providers
tronbg file app/auth.php
như sau :
Chúng ta đăng ký tài khoản với hệ thống thì trường password thì phải tối thiểu 60 ký tự và tối đa 255 ký tự nhé. Chúng ta cũng có thể đổi thay đổi cho trường remember_token
là nullable()
khi migrate bảng users
.Ak mình nới thêm chút về cái trường remember_token
- đây là trường sẽ lưu token để giành cho chức năng Remember me
mình sẽ giới thiệu ở phần sau nhé. Đừng lo lắng nhé nếu mà chúng ta cứ sử dụng như default thì chúng ta chẳng cần động vào file config/auth.php
này làm gì !!!!
2.Làm quen với Authentication trong Laravel
Controller
Laravel sẽ có một vài các controller của Authentication có sẵn trong prject Laravel của chúng ta. Nó nằm ở App\Http\Controller\Auth namespace và chúng nằm trong folder app/Http/Controllers/Auth
Chúng ta cùng điểm qua một chút xem các controller này làm gì nhé
ForgotPasswordController
dùng để cho điều khiển cho chức năng khi người dùng quên mật khẩu, thì hệ thống sẽ bắt người dùng nhập mail đăng ký với hệ thống để gửi mật khẩu mới.
LoginController
làm nhiệm vụ điều khiển khi người dùng đăng nhập vào hệ thống. Người dùng sẽ đăng nhập bằng mail với mật khẩu khi đăng kí với hệ thông.
RegisterController
làm nhiệm vụ đăng ký một thành viên mới trong hệ thống với các
ResetPasswordController
làm nhiệm vụ điều khiển khi một user muốn thay đổi mật khẩu tài khoản đăng nhập hệ thống.
Thành phần được sinh ra
Để bắt đầu thực hiện công việc xác thực cho hệ thống chúng ta hãy thực hiền 2 câu lệnh sau:
Khi thực hiện xong thì hệ thống sẽ sinh ra cho chúng ta những thứ sau. Thứ nhất các bạn vào routes/web.php
sẽ thấy những dòng code này sinh ra
Vậy chúng ta cũng có thể hiểu, hệ thống sẽ tự sinh ra cho chúng ta những route để phục vụ cho việc login, logout, register, forgot password. Các bạn cũng có thể sử dụng câu lệnh php artisan route:list
để xem được các thông tin như sau :
Ngoài ra trong app/Http/Controllers sẽ sinh ra HomeController
, và các bạn lưu ý một điều là khi chúng ta enter câu lệnh php artisan make:auth
thì nếu chúng ta có file HomeController.php
trong folder app/Http/Controllers thì hệ thống sẽ báo là chúng ta có muốn xóa file HomeController.php cũ đó đi để sinh ra một file HomeController.php mới hay không. Nếu không thì vẫn giữ nguyên file HomeController.php cũ ban đầu.
Tiếp nữa các bạn vào folder resource/views
thì ở đây sé sinh ra một folder chứa các template của auth, và một template home.blade.php
.
Tùy biến Path trong controller
Ở trong LoginController, RegisterController, ResetPasswordController
các bạn có thấy biến $redirect
không, biến này giúp chúng ta điều chỉnh lại cái đường dẫn mà khi ta làm xong công việc login, register, reset password sẽ redirect tới đường dẫn mà ta tùy chỉnh.
Khi user không được xác nhận thành công, họ sẽ tự động chuyển hướng quay lại form đăng nhập. Tiếp theo bạn cũng có thể điều chỉnh trong middeware RedirectIfAuthenticated
Tùy biến Username, Guard
Theo mặc định của Laravel thì sẽ đăng nhập bằng email
. Nếu muốn tùy chỉnh thì chúng ta cũng có thể vào LoginController
để định nghĩa method username
Chúng ta cũng có thể tùy biến guard
- sử dụng để xác thực user. Để bắt đầu, định nghĩa một phương thức guard
trong LoginController, RegisterController, ResetPasswordController
. Hàm này sẽ trả về một thể hiển guard.
Tùy biến Validator, Storage khi register
Trong RegisterController
các bạn cũng có thể customize lại một thành viên mới đăng ký như nào. Các bạn có thể thêm trường cho bảng users
để lưu nhiều thông tin về user khi đang ký hơn. Ví dụ theo bảng users
có sẵn trong Laravel thì chỉ có các trường như này
Các bạn có thể tạo 1 file mới migration mới và thêm các trường cho bảng users
Tiếp tục chúng ta sẽ cho hiển thị thêm 2 trường input để nhập address và phone của người dùng, nhớ thêm các trường vừa thêm trong biến $fillable
của model User nhé. Sau đó trong RegisterController chúng ta sẽ thêm như sau :
Đây là ví dụ mình muốn customize lại phần register, nhưng trong thực tế thì người dùng ko mong muốn phải nhập nhiều dữ liệu như này, chúng ta có thể cho người dùng đăng ký các trường mặc định như trong Laravel, có điều vào phần chức năng chỉnh sửa Profile thì chúng ta mới cho update cập nhật thông tin người dùng !!!
Truy suất người dùng đã xác thực
Khi mà các bạn đăng nhập thành công hệ thống thì các bạn có thể truy cập thông tin người dùng đã xác thực ở mọi nơi. Các bạn cần use use Illuminate\Support\Facades\Auth
để sử dụng Auth
nhé.
Để xem người dùng đã xác thực (đăng nhập được vào hệ thống) hay chưa thì dùng
Middleware
Trong Laravel , authentication có middleware auth
, hệ thống muốn chắc chắn rằng người dùng phải đăng nhập xác thực trước khi được làm một số các thao tác đối với hệ thống. Middleware nằm trong ở app/Http/Middleware/RedirectIfAuthenticated.php
. Các bạn có thể sử dụng ngay ở routes
hoặc trong hàm __contruct()
ở mỗi Controller.
Khi bạn gán dùng middleware auth trong route, bạn cũng có thể chỉ định guard nào sẽ được sử dụng để thực hiện công việc xác thực. Nhưng những guard mà bạn có thể lựa chọn chỉ được lựa auth.php
Ví dụ
3.Xác thực người dùng thủ công
Nhiều bạn không muốn dùng authentication controller có sẵn để xác thực người dùng. Đừng lo lắng về vấn đề đấy, chúng ta có thể tự xác thực theo ý muôn của chúng ta bằng cách sử dụng các class có sẵn ở Auth
. Hãy chú ý import Illuminate\Support\Facades\Auth
Giải thích một chút nhé: Khi ta sử dụng Auth::attempt()
nó sẽ nhận vào một mảng các key/value , như ví dụ ở trên thì hệ thống sẽ kiểm tra xem email có trong bảng users hay không, nếu có thì trường hash password trong bảng users sẽ được lấy ra để so sánh với hash password
. Và giá trị của Auth::attempt()
sẽ tra về false hoặc true.
Chúng ta cũng có thể thêm trường thuộc tính vào Auth::attemp()
để xác thực. Ví dụ chúng ta muốn chỉ admin mới được đăng nhập hệ thống
Chú ý
Ngoài cách sử dụng route('logout')
để logout user ra ngoài khỏi hệ thống thì chúng ta có thể sử dụng Auth::logout()
Ghi nhớ người dùng (Remember me)
Khi mà người dùng request đăng nhập lên hệ thống thì trên server sẽ sinh ra session, đồng thời server sẽ set header trên response trả về client. Mục đích của header này là lưu cookie ở client. Trong cookie sẽ chứa session id tương ứng session trên server. Nhờ đó mà server sẽ biết được ai request ở lần tiếp theo.
4.Kết luận
Bài viết trên mình đã giới thiệu cho các bạn những thứ gì cơ bản nhất về authentication trong Laravel, còn rất nhiều hàm mà Auth
hỗ trợ, các bạn có thể xem trong documentation của nó nhé. Mọi thắc mắc gì hãy comment phía dưới bài viết của mình nhé.
5.Tham khảo
Last updated