يجعل Laravel Impersonate من السهل المصادقة كمستخدمين لديك . أضف سمة بسيطة إلى نموذج المستخدم الخاص بك وانتحال شخصية أحد المستخدمين لديك بنقرة واحدة.
إصدار | يطلق |
---|---|
6.x إلى 11.x | 1.7 |
6.x، 7.x | 1.6 |
5.8 | 1.5 |
5.7، 5.6 | 1.2 |
5.5، 5.4 | 1.1 |
composer require lab404/laravel-impersonate
config/app.php
: ' providers ' => [
// ...
Lab404 Impersonate ImpersonateServiceProvider ::class,
],
Lab404ImpersonateModelsImpersonate
إلى نموذج المستخدم الخاص بك. انتحال شخصية مستخدم:
Auth :: user ()-> impersonate ( $ other_user );
// You're now logged as the $other_user
ترك انتحال الشخصية:
Auth :: user ()-> leaveImpersonation ();
// You're now logged as your original user.
في ملف المسارات الخاص بك، ضمن البرامج الوسيطة للويب، يجب عليك استدعاء ماكرو المسار impersonate
.
Route :: impersonate ();
وبدلاً من ذلك، يمكنك تنفيذ هذا الماكرو باستخدام RouteServiceProvider
الخاص بك.
namespace App Providers ;
class RouteServiceProvider extends ServiceProvider
{
public function map () {
Route :: middleware ( ' web ' )-> group ( function ( Router $ router ) {
$ router -> impersonate ();
});
}
}
// Where $id is the ID of the user you want impersonate
route ( ' impersonate ' , $ id )
// Or in case of multi guards, you should also add ` guardName ` (defaults to ` web `)
route ( ' impersonate ' , [ ' id ' => $ id , ' guardName ' => ' admin ' ])
// Generate an URL to leave current impersonation
route ( ' impersonate.leave ' )
بشكل افتراضي، يمكن لجميع المستخدمين انتحال شخصية مستخدم.
تحتاج إلى إضافة الأسلوب canImpersonate()
إلى نموذج المستخدم الخاص بك:
/**
* @return bool
*/
public function canImpersonate ()
{
// For example
return $ this -> is_admin == 1 ;
}
بشكل افتراضي، يمكن انتحال هوية كافة المستخدمين.
تحتاج إلى إضافة التابع canBeImpersonated()
إلى نموذج المستخدم الخاص بك لتوسيع هذا السلوك:
/**
* @return bool
*/
public function canBeImpersonated ()
{
// For example
return $ this -> can_be_impersonated == 1 ;
}
// With the app helper
app ( ' impersonate ' )
// Dependency Injection
public function impersonate ( ImpersonateManager $ manager , $ user_id ) { /* ... */ }
$ manager = app ( ' impersonate ' );
// Find an user by its ID
$ manager -> findUserById ( $ id );
// TRUE if your are impersonating an user.
$ manager -> isImpersonating ();
// Impersonate an user. Pass the original user and the user you want to impersonate
$ manager -> take ( $ from , $ to );
// Leave current impersonation
$ manager -> leave ();
// Get the impersonator ID
$ manager -> getImpersonatorId ();
الحماية من انتحال الشخصية
يمكنك استخدام البرنامج الوسيط impersonate.protect
لحماية مساراتك من انتحال شخصية المستخدم.
يمكن أن تكون هذه البرامج الوسيطة مفيدة عندما تريد حماية صفحات معينة مثل اشتراكات المستخدمين، وبطاقات ائتمان المستخدمين، ...
Router :: get ( ' /my-credit-card ' , function () {
echo " Can't be accessed by an impersonator " ;
})-> middleware ( ' impersonate.protect ' );
هناك حدثان متاحان يمكن استخدامهما لتحسين سير عملك:
TakeImpersonation
عندما يتم انتحال الشخصية.LeaveImpersonation
عند ترك انتحال. يُرجع كل حدث خاصيتين $event->impersonator
و $event->impersonated
تحتويان على مثيل نموذج المستخدم.
تأتي الحزمة مع ملف التكوين.
قم بنشره باستخدام الأمر التالي:
php artisan vendor:publish --tag=impersonate
الخيارات المتاحة:
// The session key used to store the original user id.
' session_key ' => ' impersonated_by ' ,
// Where to redirect after taking an impersonation.
// Only used in the built-in controller.
// You can use: an URI, the keyword back (to redirect back) or a route name
' take_redirect_to ' => ' / ' ,
// Where to redirect after leaving an impersonation.
// Only used in the built-in controller.
// You can use: an URI, the keyword back (to redirect back) or a route name
' leave_redirect_to ' => ' / '
هناك ثلاثة توجيهات بليد المتاحة.
@canImpersonate ( $guard = null )
< a href = " {{ route ( ' impersonate ' , $user -> id ) } } " >Impersonate this user a >
@endCanImpersonate
يكون هذا مفيدًا عندما يكون لديك قائمة مستخدمين وتريد إظهار زر "انتحال الشخصية" بجوار كافة المستخدمين. لكنك لا تريد هذا الزر الموجود بجوار المستخدم الحالي الذي تمت مصادقته ولا للمستخدمين الذين لا ينبغي أن يكونوا قادرين على انتحال هويتهم وفقًا لتطبيق canBeImpersonated()
.
@canBeImpersonated ( $user , $guard = null )
< a href = " {{ route ( ' impersonate ' , $user -> id ) } } " >Impersonate this user a >
@endCanBeImpersonated
@impersonating ( $guard = null )
< a href = " {{ route ( ' impersonate.leave ' ) } } " >Leave impersonation a >
@endImpersonating
vendor/bin/phpunit
loginAsId()
؟تضيف هذه الحزمة وظائف أوسع، بما في ذلك توجيهات Blade للسماح لك بتجاوز التحليلات وأحداث التتبع الأخرى عند انتحال الهوية، وإطلاق الأحداث بناءً على حالة الانتحال، والمزيد. مناقشة مختصرة في القضايا/5
معهد ماساتشوستس للتكنولوجيا