laravel 模仿
1.7.5
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.
在路由檔案中的 Web 中介軟體下,您必須呼叫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
包含 User 模型實例。
軟體包附帶一個設定檔。
使用以下命令發布它:
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 ' => ' / '
共有三個可用的 Blade 指令。
@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 指令,可讓您在模擬時覆蓋分析和其他追蹤事件、基於模擬狀態的火災事件等。 issues/5 的簡短討論
麻省理工學院