استفاده از Auth لاراول با جدول سفارشی و فیلدهای سفارشی
سلام
من به پروژه دارم که با لاراول هستش
یک جدول دارم به نام prj_user که در این جدول اطلاعات کاربران ذخیره میشه.
فیلد ها جدول در زیر نوشته شده.
CREATE TABLE IF NOT EXISTS `prj_user` (
`usr_user_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`usr_firstname` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`usr_lastname` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`usr_email` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`usr_pass` varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL,
`usr_created_at` timestamp NULL DEFAULT NULL,
`usr_updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`usr_user_id`),
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
برای این جدول یه مدل ساختم به نام UserCustom.php در آدرس app /Models
فولدر Models خودم ایجاد کردم و تمامی مدل های پروژه اونجا ذخیره می کنم.
کد های زیر کد مدل UserCustom.php است.
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class UserCustom extends Model
{
public $table='prj_user';
public $primaryKey='usr_user_id';
const CREATED_AT='usr_created_at';
const UPDATED_AT='usr_updated_at';
protected $fillable = [
'usr_user_id',
'usr_firstname',
'usr_lastname',
'usr_email',
'usr_pass',
'usr_lastname',
'usr_created_at',
'usr_updated_at',
];
}
من می خوام auth::attempt و بقیه متد های کلاس auth به این جدول custom و این مدل custom وصل بشه.
من دیگه نمی خوام از مدل User و جدول User پیش فرض لاراول استفاده کنم.
آیا میشه لاراول در این حد سفارشی سازی کرد؟
آیا همچنین چیزی امکان داره؟

بله همچین چیزی امکان داره
باید در قسمت کانفیگ auth که ادرسش به این صورت config/auth.php هست مقدار کلید model که در کلید providers قراره داره رو تغییر بدید و هر مدلی که خواستید بذارید

دو کد زیر در فایل config/auth اضافه کردم
'guards' => [
'usercustom' => [
'driver' => 'session',
'provider' => 'userCustomProvider',
],
],
'providers' => [
'userCustomProvider' => [
'driver' => 'eloquent',
'model' => App\Models\UserCustom::class,
],
],
بعد در فولدر Providers دو تا کلاس ساختم CustomAuthProvider و CustomUserProvider
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Auth;
use App\Providers\CustomUserProvider;
use Illuminate\Support\ServiceProvider;
class CustomAuthProvider extends ServiceProvider {
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
$this->app['auth']->extend('usercustom',function()
{
return new CustomUserProvider();
});
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
//
}
}
<?php
namespace App\Providers;
use App\Models\UserCustom;
use Carbon\Carbon;
use Illuminate\Auth\GenericUser;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Contracts\Auth\UserProvider;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Log;
class CustomUserProvider implements UserProvider {
/**
* Retrieve a user by their unique identifier.
*
* @param mixed $identifier
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*/
public function retrieveById($identifier)
{
// TODO: Implement retrieveById() method.
$qry = UserCustom::where('usr_user_id','=',$identifier);
if($qry->count() >0)
{
$user = $qry->select('usr_user_id', 'usr_firstname', 'usr_last_name', 'usr_email', 'usr_pass')->first();
$attributes = array(
'usr_user_id' => $user->usr_user_id,
'usr_firstname' => $user->usr_firstname,
'usr_last_name' => $user->usr_last_name,
'usr_email' => $user->usr_email,
'usr_pass' => $user->usr_pass,
);
return $user;
}
return null;
}
/**
* Retrieve a user by by their unique identifier and "remember me" token.
*
* @param mixed $identifier
* @param string $token
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*/
public function retrieveByToken($identifier, $token)
{
// TODO: Implement retrieveByToken() method.
$qry = UserCustom::where('usr_user_id','=',$identifier);
if($qry->count() >0)
{
$user = $qry->select('usr_user_id', 'usr_firstname', 'usr_last_name', 'usr_email', 'usr_pass')->first();
$attributes = array(
'usr_user_id' => $user->usr_user_id,
'usr_firstname' => $user->usr_firstname,
'usr_last_name' => $user->usr_last_name,
'usr_email' => $user->usr_email,
'usr_pass' => $user->usr_pass,
);
return $user;
}
return null;
}
/**
* Update the "remember me" token for the given user in storage.
*
* @param \Illuminate\Contracts\Auth\Authenticatable $user
* @param string $token
* @return void
*/
public function updateRememberToken(Authenticatable $user, $token)
{
// TODO: Implement updateRememberToken() method.
$user->setRememberToken($token);
$user->save();
}
/**
* Retrieve a user by the given credentials.
*
* @param array $credentials
* @return \Illuminate\Contracts\Auth\Authenticatable|null
*/
public function retrieveByCredentials(array $credentials)
{
// TODO: Implement retrieveByCredentials() method.
$qry = UserCustom::where('usr_email','=',$credentials['usr_email']);
if($qry->count() > 0)
{
$user = $qry->select('usr_user_id','usr_email','usr_pass')->first();
return $user;
}
return null;
}
/**
* Validate a user against the given credentials.
*
* @param \Illuminate\Contracts\Auth\Authenticatable $user
* @param array $credentials
* @return bool
*/
public function validateCredentials(Authenticatable $user, array $credentials)
{
// TODO: Implement validateCredentials() method.
// we'll assume if a user was retrieved, it's good
// DIFFERENT THAN ORIGINAL ANSWER
if($user->email == $credentials['usr_email'] && Hash::check($credentials['usr_pass'], $user->getAuthPassword()))//$user->getAuthPassword() == md5($credentials['password'].\Config::get('constants.SALT')))
{
//$user->last_login_time = Carbon::now();
$user->save();
return true;
}
return false;
}
}
بعد دو تا روت ساختم
Route::get('user/login','UserController@loginForm');
Route::post('user/login','UserController@loginCheck');
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
class UserController extends Controller
{
public function loginForm () {
return view('login');
}
public function loginCheck (Request $request) {
$credentials=array([
'usr_email'=> $request->email,
'usr_pass'=>$request->password
]);
if (Auth::guard('usercustom')->attempt($credentials)){
echo "1";
}else {
echo "0";
}
}
}
کلاس مدل هم در اول تاپیک نوشتم
وقتیکه به دستور Auth::guard میرسه ارور زیر رو میده
خیلی تو اینترنت گشتم نتونستم این مشکلو حل کنم
مشکل در فیلدهای جدوله لاراول به طور پیش فرض فیلد email و password می خواد.درصورتیکه من اون ها رو تغییر دادم به usr_email و usr_pass
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .