Pro Laravel giúp em với ! Câu hỏi về Manually Authenticating trong Laravel
Em muốn custom lại điều kiện check login của laravel theo như 2 query bên dưới.
Có cách nào viết Auth::attempt() để nó thực hiện kiểm tra với query bên dưới ko ạ?
where email = $email AND password = $pw AND role in ('Admin', 'Admod')
Và
where email = $email AND password = $pw AND role != 'ABC'
Mong mọi người giúp đỡ ạ. e đang dùng laravel 8 ạ.
Em đọc thì có vẻ chỉ có so sánh equal chứ ko thấy có phủ định.
E cảm ơn
3 CÂU TRẢ LỜI
Bạn có thể tự viết 1 cái auth provider như này
<?php
namespace App\Auth;
use Illuminate\Auth\EloquentUserProvider;
use Illuminate\Contracts\Auth\UserProvider as UserProviderInterface;
class UserProvider extends EloquentUserProvider implements UserProviderInterface
{
protected function newModelQuery($model = null)
{
// Thêm đk cho query ở đây hoặc làm gì đó tùy bạn
return parent::newModelQuery($model)->where('role', '!=', 'ABC');
}
}
Xong rồi override cái eloquent provider bằng cái bạn vừa mới thêm ở file AuthServiceProvider.php
như này
public function boot()
{
$this->registerPolicies();
Auth::provider('eloquent', function ($app, array $config) {
return UserProvider(app('Illuminate\Contracts\Hashing\Hasher'), $config['model']);
});
}
Giờ bạn muốn custom thì bạn có thể tạo 1 route có đường dẫn giống hệt và gọi tới controller của bạn. Hoặc ở trong controller Auth mà laravel generate ra bạn có thể đặt một function giống hệt function laravel sử dụng để xử lý, lúc này function đó sẽ được overwrite lại bằng function bạn vừa tạo ra
@duong.manh.hoang
cảm ơn bạn. Mình đang ko hỏi về cách override.
Câu hỏi của mình là khi dùng hàm attempt. Thì có cách nào thêm condition cho nó, để nó check theo câu truy vấn kia ko
where email = $email AND password = $pw AND role in ('Admin', 'Admod')
Và
where email = $email AND password = $pw AND role != 'ABC'
@ngankim attempt thì thêm được điều kiện nhưng phủ định thì theo mình nghĩ là không
Với Auth::attemp thì bạn cũng có thể thêm các điều kiện bổ sung vào truy vấn xác thực, vì nó nhận 1 array để check, ví dụ:
if (Auth::attempt(array('email' => $email, 'password' => $password, 'role_id' => 1])))
{
// The user is active, not suspended, and exists.
}
@hoangminhhuet
cái đó chắc bạn cũng biết rồi cậu ơi, cái bạn kia hỏi và có thể thêm điều điện bổ sung như "!=" hoặc là where in cơ. attempt chỉ nhận về mảng và nó sẽ so sánh bằng hết c ạ.
chắc chỉ còn cách của @phuongth thôi