Hỏi về Role Middleware trong laravel
Bình thường em đùng login mặc định của laravel , phần check role em tạo 1 middleware rồi viết code: if(Auth::user()->role = admin) { .... } Nhưng bây giờ em phải làm login, bằng API, em cũng tạo một middleware như trên nhưng phần gọi Auth::user() ra lại bị null
Theo em thấy là phần login mặc định của laravel là cho phép login rồi -> check role -> nếu role hợp lệ thì ok , không thì redirect back(). còn cái API thì là chưa login đc nên không gọi đc Auth::user().
Cho em hỏi là bây giờ em phải làm sao . (trong bảng user có type = 1 , 2 ,3) nếu bằng 1 => đăng nhập user 2 => đăng nhập ng giao hàng 3 => đăng nhập ng quản trị . Các anh cho em xin giải pháp với ạ?
2 CÂU TRẢ LỜI
@nhatnguyen123321
Bạn tìm hiểu về sanctum hỗ trợ authentication cho api trong Laravel nhé.
https://laravel.com/docs/8.x/sanctum
Lý do bạn gọi Auth::user() nó ra null là vì khi bạn gọi api thì trên server ko nhận được cookie ở client truyền lên.
Chính vì thế bạn phải truyền lên 1 cái gì đó khi call api, thì sanctum hỗ trợ cho bạn phần access token, khi bạn truyền
access_token lên thì bạn có thể lấy đc user info thông qua $request->user('sanctum');
-
Đối với web, Laravel căn cứ vào session và cookie để xác định bạn đã đăng nhập hay chưa, đang đăng nhập bằng tài khoản nào.
-
Đối với API, thường mọi người sẽ làm stateless, không còn có session và cookie nữa. Khi đó sẽ cần giải pháp authentication khác như dùng API Token/Access Token, OAuth.. Có nhiều library hỗ trợ implement cho Laravel như: Passport, Sanctum... Cơ chế xử lý có thể khác nhau nhưng bản chất, client (mobile) sẽ gửi request luôn kèm header
Authorization
chứaAccess Token
. Đó là căn cứ để server authenticate. -
Bây giờ bạn cần kiểm tra xem, cái middleware Authentication kia của bạn đã config cho đúng guard của API chưa? Với Laravel, nó hỗ trợ multi-authentication nên cần check chính xác. VD: API bạn dùng guard 'api' mà default là 'web' thì bạn
Auth::user()
nó sẽ luônnull
, thay vào đó phải làAuth::user('api')
chẳng hạn. -
Chọn một cái library như: Passport, Sanctum... hoặc tự viết tùy nhu cầu của bạn.