Laravel Impersonate を使用すると、ユーザーとしての認証が簡単になります。ユーザー モデルに簡単な特性を追加し、ワンクリックでユーザーの 1 人になりすまします。
バージョン | リリース |
---|---|
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
をUserモデルに追加します。 ユーザーになりすます:
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 ' );
ワークフローを改善するために使用できるイベントが 2 つあります。
TakeImpersonation
偽装が行われるときに発生します。LeaveImpersonation
偽装が終了すると発生します。各イベントは、User モデル インスタンスを含む 2 つのプロパティ$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 ' => ' / '
使用可能な Blade ディレクティブが 3 つあります。
@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
マサチューセッツ工科大学