Giter VIP home page Giter VIP logo

nova-impersonate's Introduction

Nova Impersonate Field

Latest Version on Packagist Total Downloads

This field allows you to authenticate as your users.

screenshot1 screenshot2 screenshot3

Behind the scenes 404labfr/laravel-impersonate is used.

Installation

You can install the package in to a Laravel app that uses Nova via composer:

composer require kabbouchi/nova-impersonate

Usage

Add Impersonate::make($this) field in App\Nova\User.php

<?php

namespace App\Nova;

use KABBOUCHI\NovaImpersonate\Impersonate;

...

class User extends Resource
{
	...
	
	public function fields(Request $request)
	{
		return [
			ID::make()->sortable(),

			Gravatar::make(),

			Text::make('Name')
				->sortable()
				->rules('required', 'max:255'),

			Text::make('Email')
				->sortable()
				->rules('required', 'email', 'max:255')
				->creationRules('unique:users,email')
				->updateRules('unique:users,email,{{resourceId}}'),

			Password::make('Password')
				->onlyOnForms()
				->creationRules('required', 'string', 'min:6')
				->updateRules('nullable', 'string', 'min:6'),


			Impersonate::make($this),  // <---
		
			// or
            
            Impersonate::make($this->resource), // works in lenses
            
            // or
		
			Impersonate::make($this)->withMeta([
			    'hideText' => false,
			]),
		
			// or
		
			Impersonate::make($this)->withMeta([
			    'redirect_to' => '/custom-redirect-url'
			]),

		];
	}

    ...
}

Advanced Usage

By default all users can impersonate an user.
You need to add the method canImpersonate() to your user model:

    /**
     * @return bool
     */
    public function canImpersonate($impersonated = null)
    {
        // For example
        return $this->is_admin == 1;
    }

By default all users can be impersonated.
You need to add the method canBeImpersonated() to your user model to extend this behavior: Please make sure to pass instance Model or Nova Resource Impersonate::make($this) Impersonate::make($this->resource)

    /**
     * @return bool
     */
    public function canBeImpersonated(?\Illuminate\Contracts\Auth\Authenticatable $impersonator = null)
    {
        // For example
        return $this->can_be_impersonated == 1;
    }

By default name field is used for when displaying what user is impersonated at a moment. You need to add the method impersonateName() to your user model to extend this behavior: Please make sure to pass instance Model or Nova Resource Impersonate::make($this) Impersonate::make($this->resource)

    /**
     * @return string
     */
    public function impersonateName()
    {
        // For example
        return $this->email;
    }

Events

You can hook onto the underlying package events

May be userful for things like setting session data

  • Lab404\Impersonate\Events\TakeImpersonation
  • Lab404\Impersonate\Events\LeaveImpersonation

You can optionally publish the config file with:

php artisan vendor:publish --tag=nova-impersonate-config

This is the default content of the config file published at config/nova-impersonate.php:

<?php

return [
	'enable_middleware' => true, // To inject the 'nova-impersonate::reverse' view in every route when impersonating 
	'redirect_back'     => true, // false (nova path), true or <url>
	'redirect_to'       => '/',
	'key_down'          => 'i', // Press `i` to impersonate user in details page
	'middleware'        => [
            'base' => 'web', // Middleware used for nova-impersonate routes
            'leave'  => 'auth', // Extra middleware used for leave route
    ],
];

You can publish and customize the nova-impersonate::reverse view

php artisan vendor:publish --tag=nova-impersonate-views

Credits

The MIT License (MIT). Please see License File for more information.

nova-impersonate's People

Contributors

ali-raza-saleem avatar andreschwarzer avatar binarykitten avatar brentkozjak avatar crynobone avatar dennis-fransen avatar dmyers avatar ekandreas avatar finagin avatar janicerar avatar jankremlacek avatar japseyz avatar joselara avatar jubeki avatar kabbouchi avatar laurencei avatar luigel avatar mabdullahsari avatar matthewhallcom avatar mbardelmeijer avatar modstore avatar nicko170 avatar paras-malhotra avatar pravk avatar sdapkus avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

nova-impersonate's Issues

impersonation seems not to work in APP_ENV=production

I have a stange problem,
and I don't know why it occurs and if it has to do with this package at all:

In my dev and test systems APP_ENV=local is set. Here impersonation works.
In my production systems APP_ENV=production is set. Here, all Impersonations lead to a 403 page.

Anyone has had this experience here, as well?

404 when trying to impersonate

When I try to impersonate a user I get a 404. After manually changing the url the impersonation does not work.

The url he's trying to follow:
/nova-impersonate/users/8/web?redirect_to=%2F

My User Resource:

public function fields(Request $request)
    {
        return [
            ...
            Impersonate::make($this),
            ...
        ];
    }

I'm also using the canImpersonate method on my user, but that returns true

This looks to me as the most basic implementation of your package, but I can't get it to work

Rendering Issue (min-width) Nova 2.9.2

Looks like a "min-width: 56px" was added to ".table td" style that is causing the icon column to render too wide. Also, the vertical align is slightly off.

2019-12-15_15-44-15

Logging out of impersonated user

If you are impersonating a user and you log out of that user you'll get an error "Trying to get a property of a non object" from the impersonating view. This is because there is not auth()->user() set since you've logged out.

Alternate display method

Not sure if anyone will find this useful, but I didn't care for the location of the fixed div (seemed to always be covering something I wanted to read. I tweaked the reverse.blade.php view:

<div id="impersonate" style="
     position: relative;
     padding: 15px 20px 15px 15px;
     width: 100%;
     background-color: #fdbfb6;
     text-align: center;
    ">
    @if( auth()->user()->name ) Currently logged in as {{ auth()->user()->name }} @endif
    <a href="/nova-impersonate/leave" style="text-decoration:underline;color: black;font-weight: bold">
        Logout!
</a>
</div>
<script>
    window.onload = function (evt) {
        var e = document.querySelector('#impersonate');
        e.remove();
        document.body.prepend(e);
        document.querySelector('.bg-logo').style.top = "48px";
    };
</script>

screen shot 2019-01-10 at 10 05 24 pm

Logout after impersonate

Hi, thank you creating this package. At first everything worked fine but later when I had to seperate admin users and normal users in different tables I ran into trouble. When I login as admin in Nova and impersonate a user it seems I get logged out and returned to the login screen.

The admin users have a "admins" database database, admin guard and are only used for Nova. The other users are just regular Laravel Users with the web guard. So what I'm trying to do is login to Nova as admin and impersonate a regular web user but that doesn't work.

Is it possible to use your impersonate package like this?

Feature Request: impersonated and impersonator arguments

canBeImpersonated(User $impersonator = null) & canImpersonate(User $impersonated = null)

It will be good if these 2 methods can take in the impersonated and impersonator argument. This can allow for use cases such as:

  • Root admin can impersonate super admin & normal users
  • Super admin can impersonate normal admins & normal users. But cannot impersonate Root admin
  • Normal admins can impersonate normal users but not super admins and above.
  • .etc

If i have some time i can try making a PR if you are open to this feature or you can add them yourself too.

Empty Prompt to Select Guard?

I just updated and now when I try to impersonate a user, it asks me to pick a Guard, yet the list is empty. What am I missing here? I don't see anything in the docs about the multi-guard feature so I don't know what I need to do to get it back up and running? Thanks!

Impersonate button renders as plain text

Hi there,

Thanks for your package! I would like to use this in my projects but the impersonate button shows as plain text instead of rendering as html.

Any ideas how to solve this?

Thanks!

Exception "Route [login] not defined." on leaving impersonation - possible error in default configuration file

Hey :)

I've just tried the package and stumbled upon a small error that confused me a bit at first.

If using the default configuration provided with the nova package and impersonate any user, then leave the impersonation, an exception is thrown:

"Route [login] not defined."

After publishing the config file i noticed that the following configuration is set per default:

/*
 * Middleware used for nova-impersonate routes
 */
'middleware'        => [
    /*
     * Middleware used for nova-impersonate routes
     */
    'base'  => 'web',
    /*
     * Extra middleware used for leave route
     */
    'leave' => 'auth', // <= important part
],

As the default nova auth guard is named "nova", the "auth" guard doesn't know about any sessions and trys to redirect to the login (which may not be defined in an "nova only environment")

Changing 'leave' => 'auth' to 'leave' => 'nova' solves the problem.

You may consider to change the default value to "nova" - or do i miss something else?

And many thanks for the package :)

key_down issue on relation search

Hello,

If a nova resource has BelongsTo relation to User with searchable() method:
e.g. in Posts resource fields:

BelongsTo::make('User')
                ->rules('required')
                ->searchable(),

When searching for a user and hitting 'i' key on the keyboard sometimes the page is redirected with impersonating this user.

Reason in the config file, the 'key_down' is 'i' so it confuses the search, So as a workaround changed 'key_down' value to empty string. Would be better to ensure that the key_down works only in detail view.

Nothing added on Nova

Hello,

I've added your package on my project but it don't seem to work.
I've followed your instruction to install and use this package but there is something wrong with the added cell.

Here what I have on my index view:
image

<index-null resource-name="users" via-resource="" via-resource-id="" field="[object Object]" class="text-center"></index-null>

It's the same on detail view.

Thanks

Doesn't work with custom user model primary key

I have a user_id primary key for the user model and on clicking the impersonate button, I get redirected to /nova-impersonate/users/null?redirect_to=/ that results in a 404.

I see that the code uses $user->id in many places and should be using $user->getKey() instead for this to properly work.

For the time being I added an id accessor on the user model using getIdAttribute and it works but this should be handled by the package without hacky workarounds.

Minor error in documentation

In the usage example, there is a missing “$this” in the example for the redirect:

“Impersonate::make()->withMeta([ 'redirect_to' => '/custom-redirect-url' ]), “ Should be “Impersonate::make($this)->withMeta([ 'redirect_to' => '/custom-redirect-url' ]), “

If you would like for me to fix it please let me know, and I will make a Pr

Impersonate From Within App

Thank you for this great package. We use it all the time ;)
But now I would like to add some impersonation shortcuts directly to our app, because we often need to impersonate as the same user.
And I wonder what's the best way to do this.
I know this package is a nova package, so this isn't a use case its made for.
But I had quite a hard time understanding how this behaves in conjunction with the underlying 404labfr/laravel-impersonate package.

However I have come to an almost satisfying result:

  • added the default routes of the underlying package via Route::impersonate()
  • added a link to the take route

This way I can impersonate via the link and I am redirected to the app as the impersonated user with the reverse panel displayed exactly like it would behave if I had impersonated through nova.

But the problem lies in the detail. I would like to use the reverse panel and redirect to the same page, or at least the app home instead of nova. But since my link uses the other controller route, the redirect session cookie is not properly set.

How could I do that?

I guess this is related to #63 (comment), because if I could just use the nova-impersonate routes everything should work fine.

Impersonate icons no longer being shown in index or detail view

Thanks for this very useful integration.

Noticed yesterday that the impersonate icon is no longer being shown in index view. I'm using Nova v2.0.9 and latest version of your package, v1.0.16

Inspecting the HTML, I am seeing the below:

<td><index-null resource-name="users" via-resource="" via-resource-id="" field="[object Object]" class="text-center"></index-null></td>

Something appears to be wrong in the JSON returned from the nova-api call:

image

Ability to disable the Impersonate middleware

Hey, can it be added to disable the Impersonate middleware? We use a custom view in our template so we don't need to implement the reverse view. Currently overwriting the view file with an empty template, but would be nicer if it could be disabled trough a config setting or even better, that the Impersonate should be registered manually by the developer when installing the plugin.

Fix style when using impersonation authorization

First of all I want to thank you for this package,
When we use impersonation authorization some users may see the icon of impersonation and some others not.
is there a chance to put impersonation icon on a separate column to avoid style distortion please.

How clear all cache and session on impersonate logout.

Hello,

My project is based on cache and session, i need clear on impersonate logout.

Exemple of logout in my project:

public function logout(Request $request)
    {
        session()->flush();

        Cache::pull('user-id-' .  Session()->get('user.id'));

        Auth::logout();

        return redirect(route('home'));
    }

It's possible?

Customise redirect after impersonating

Hi. Great package, thanks for making this available. It would be great if we could set a custom url to redirect to after clicking the impersonate button.

404 when enter and leaving impersonate mode

Hello,

when I click on the impersonate button I get a 404. The page wanna open following link:

http://localhost:8000/nova-impersonate/users/undefined?redirect_to=/dashboard

If I open the following link by myself, it works (replaced the undefined to an user id):

http://localhost:8000/nova-impersonate/users/2?redirect_to=/dashboard

When I want to leave the impersonate mode again I also get an 404.

When canBeImpersonated returns false, javascript errors are thrown blocking forms

Saving forms are impossible when canBeImpersonated returns false.

public function canBeImpersonated {
    return false;
}

The nova resource index in the console it returns:
Unknown custom element: <detail-null>
And on form pages it returns:
Unknown custom element: <form-null>
On submitting forms it errors out saying:
Uncaught (in promise) TypeError: Cannot read property 'status' of undefined

If canBeImpersonated returns true, all these errors disappear

Howto remove default routes?

Is it possible to disable the default routing? I used to use Route::impersonate() in routes/web.php, but it doesn't matter if i use it or not (and also empty router cache).

Reason: I'm using subdomains and these routes are unwanted there.

Breaks sharing session between subdomains?

I'm not 100% sure what's going on but adding this package breaks sharing the session between multiple apps on different subdomains. Removing it fixes it with no other changes.

Route [login] not defined when leaving impersonating mode after session expired and click "Leave impersonating"

Hi,

When I impersonate a user, then, let the app opened in the night, when I come back in the morning, the session is obviously expired. When I click on "Leave impersonating", I get a 500

2020-11-29 08:45:49] production.ERROR: Route [login] not defined. {"exception":"[object] (Symfony\\Component\\Routing\\Exception\\RouteNotFoundException(code: 0): Route [login] not defined. at /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Routing/UrlGenerator.php:429)
[stacktrace]
#0 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php(704): Illuminate\\Routing\\UrlGenerator->route()
#1 /home/ubuntu/project/app/Http/Middleware/Authenticate.php(18): route()
#2 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(83): App\\Http\\Middleware\\Authenticate->redirectTo()
#3 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(68): Illuminate\\Auth\\Middleware\\Authenticate->unauthenticated()
#4 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(42): Illuminate\\Auth\\Middleware\\Authenticate->authenticate()
#5 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Auth\\Middleware\\Authenticate->handle()
#6 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(77): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#7 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle()
#8 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#9 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle()
#10 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(121): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#11 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(63): Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest()
#12 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Session\\Middleware\\StartSession->handle()
#13 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#14 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle()
#15 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(67): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#16 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle()
#17 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#18 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Routing/Router.php(693): Illuminate\\Pipeline\\Pipeline->then()
#19 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Routing/Router.php(668): Illuminate\\Routing\\Router->runRouteWithinStack()
#20 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Routing/Router.php(634): Illuminate\\Routing\\Router->runRoute()
#21 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Routing/Router.php(623): Illuminate\\Routing\\Router->dispatchToRoute()
#22 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(166): Illuminate\\Routing\\Router->dispatch()
#23 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(128): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}()
#24 /home/ubuntu/project/vendor/kabbouchi/nova-impersonate/src/Http/Middleware/Impersonate.php(23): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#25 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): KABBOUCHI\\NovaImpersonate\\Http\\Middleware\\Impersonate->handle()
#26 /home/ubuntu/project/vendor/laravel/nova/src/Http/Middleware/ServeNova.php(26): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#27 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Laravel\\Nova\\Http\\Middleware\\ServeNova->handle()
#28 /home/ubuntu/project/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php(60): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#29 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle()
#30 /home/ubuntu/project/vendor/spatie/laravel-cookie-consent/src/CookieConsentMiddleware.php(12): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#31 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Spatie\\CookieConsent\\CookieConsentMiddleware->handle()
#32 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#33 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
#34 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#35 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle()
#36 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#37 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle()
#38 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/PreventRequestsDuringMaintenance.php(87): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#39 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle()
#40 /home/ubuntu/project/vendor/fideloper/proxy/src/TrustProxies.php(57): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#41 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Fideloper\\Proxy\\TrustProxies->handle()
#42 /home/ubuntu/project/vendor/sentry/sentry-laravel/src/Sentry/Laravel/Tracing/Middleware.php(45): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#43 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(167): Sentry\\Laravel\\Tracing\\Middleware->handle()
#44 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(103): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}()
#45 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(141): Illuminate\\Pipeline\\Pipeline->then()
#46 /home/ubuntu/project/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(110): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter()
#47 /home/ubuntu/project/public/index.php(55): Illuminate\\Foundation\\Http\\Kernel->handle()
#48 {main}
"} 

Not so annoying, but still 500 ;)

Tag last release

It seems that translations are not available, because last release has not been tagged.

Can you please tag it ? Tx !

Laravel 6 fix

Hi @KABBOUCHI

Can you please update ToolServiceProvider?

use Illuminate\Support\Arr;

/**
 * Register the tool's routes.
 *
 * @return void
 */
protected function routes()
{
    if ($this->app->routesAreCached()) {
        return;
    }

    Route::middleware(Arr::wrap(config('nova-impersonate.middleware.base')))
        ->prefix('nova-impersonate')
        ->name('nova.impersonate.')
        ->group(__DIR__.'/../routes/api.php');
}

tag release for versioning

Is it possible to tag a release - alpha, beta, whatever so package dependencies aren't tied to dev-master?

Wrong user after impersonate

After I impersonate User A and then impersonate another User B as User A and then reverse the impersonation I am logged in as the User A.

I don't think this is wanted even though it is questionable why somebody should do this.

Arg 1 passed to SessionGuard::quietLogin() must implement interface Authenticatable, instance of Collection given

Symfony\Component\Debug\Exception\FatalThrowableError: Argument 1 passed to Lab404\Impersonate\Guard\SessionGuard::quietLogin() must implement interface Illuminate\Contracts\Auth\Authenticatable, instance of Illuminate\Database\Eloquent\Collection given, called in /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php on line 292 in file /Users/jack/Sites/website/vendor/lab404/laravel-impersonate/src/Guard/SessionGuard.php on line 16

Stack trace:
  1. Symfony\Component\Debug\Exception\FatalThrowableError-&gt;() /Users/jack/Sites/website/vendor/lab404/laravel-impersonate/src/Guard/SessionGuard.php:16
  2. Lab404\Impersonate\Guard\SessionGuard-&gt;quietLogin() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php:292
  3. Illuminate\Auth\AuthManager-&gt;__call() /Users/jack/Sites/website/vendor/lab404/laravel-impersonate/src/Services/ImpersonateManager.php:71
  4. Lab404\Impersonate\Services\ImpersonateManager-&gt;take() /Users/jack/Sites/website/vendor/kabbouchi/nova-impersonate/src/Http/Controllers/ImpersonateController.php:36
  5. KABBOUCHI\NovaImpersonate\Http\Controllers\ImpersonateController-&gt;take() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
  6. call_user_func_array() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Controller.php:54
  7. Illuminate\Routing\Controller-&gt;callAction() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php:45
  8. Illuminate\Routing\ControllerDispatcher-&gt;dispatch() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Route.php:212
  9. Illuminate\Routing\Route-&gt;runController() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Route.php:169
 10. Illuminate\Routing\Route-&gt;run() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Router.php:679
 11. Illuminate\Routing\Router-&gt;Illuminate\Routing\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:30
 12. Illuminate\Routing\Pipeline-&gt;Illuminate\Routing\{closure}() /Users/jack/Sites/website/vendor/laravel/nova/src/Http/Middleware/Authorize.php:18
 13. Laravel\Nova\Http\Middleware\Authorize-&gt;handle() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
 14. Illuminate\Pipeline\Pipeline-&gt;Illuminate\Pipeline\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
 15. Illuminate\Routing\Pipeline-&gt;Illuminate\Routing\{closure}() /Users/jack/Sites/website/vendor/laravel/nova/src/Http/Middleware/BootTools.php:20
 16. Laravel\Nova\Http\Middleware\BootTools-&gt;handle() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
 17. Illuminate\Pipeline\Pipeline-&gt;Illuminate\Pipeline\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
 18. Illuminate\Routing\Pipeline-&gt;Illuminate\Routing\{closure}() /Users/jack/Sites/website/vendor/laravel/nova/src/Http/Middleware/DispatchServingNovaEvent.php:20
 19. Laravel\Nova\Http\Middleware\DispatchServingNovaEvent-&gt;handle() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
 20. Illuminate\Pipeline\Pipeline-&gt;Illuminate\Pipeline\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
 21. Illuminate\Routing\Pipeline-&gt;Illuminate\Routing\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php:43
 22. Illuminate\Auth\Middleware\Authenticate-&gt;handle() /Users/jack/Sites/website/vendor/laravel/nova/src/Http/Middleware/Authenticate.php:31
 23. Laravel\Nova\Http\Middleware\Authenticate-&gt;handle() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
 24. Illuminate\Pipeline\Pipeline-&gt;Illuminate\Pipeline\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
 25. Illuminate\Routing\Pipeline-&gt;Illuminate\Routing\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php:41
 26. Illuminate\Routing\Middleware\SubstituteBindings-&gt;handle() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
 27. Illuminate\Pipeline\Pipeline-&gt;Illuminate\Pipeline\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
 28. Illuminate\Routing\Pipeline-&gt;Illuminate\Routing\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php:49
 29. Illuminate\View\Middleware\ShareErrorsFromSession-&gt;handle() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
 30. Illuminate\Pipeline\Pipeline-&gt;Illuminate\Pipeline\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
 31. Illuminate\Routing\Pipeline-&gt;Illuminate\Routing\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php:63
 32. Illuminate\Session\Middleware\StartSession-&gt;handle() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
 33. Illuminate\Pipeline\Pipeline-&gt;Illuminate\Pipeline\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
 34. Illuminate\Routing\Pipeline-&gt;Illuminate\Routing\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php:37
 35. Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse-&gt;handle() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
 36. Illuminate\Pipeline\Pipeline-&gt;Illuminate\Pipeline\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
 37. Illuminate\Routing\Pipeline-&gt;Illuminate\Routing\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php:66
 38. Illuminate\Cookie\Middleware\EncryptCookies-&gt;handle() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
 39. Illuminate\Pipeline\Pipeline-&gt;Illuminate\Pipeline\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
 40. Illuminate\Routing\Pipeline-&gt;Illuminate\Routing\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:104
 41. Illuminate\Pipeline\Pipeline-&gt;then() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Router.php:681
 42. Illuminate\Routing\Router-&gt;runRouteWithinStack() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Router.php:656
 43. Illuminate\Routing\Router-&gt;runRoute() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Router.php:622
 44. Illuminate\Routing\Router-&gt;dispatchToRoute() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Router.php:611
 45. Illuminate\Routing\Router-&gt;dispatch() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:176
 46. Illuminate\Foundation\Http\Kernel-&gt;Illuminate\Foundation\Http\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:30
 47. Illuminate\Routing\Pipeline-&gt;Illuminate\Routing\{closure}() /Users/jack/Sites/website/vendor/laravel/nova/src/Http/Middleware/ServeNova.php:26
 48. Laravel\Nova\Http\Middleware\ServeNova-&gt;handle() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
 49. Illuminate\Pipeline\Pipeline-&gt;Illuminate\Pipeline\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
 50. Illuminate\Routing\Pipeline-&gt;Illuminate\Routing\{closure}() /Users/jack/Sites/website/vendor/barryvdh/laravel-debugbar/src/Middleware/InjectDebugbar.php:58
 51. Barryvdh\Debugbar\Middleware\InjectDebugbar-&gt;handle() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
 52. Illuminate\Pipeline\Pipeline-&gt;Illuminate\Pipeline\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
 53. Illuminate\Routing\Pipeline-&gt;Illuminate\Routing\{closure}() /Users/jack/Sites/website/app/Http/Middleware/SentryContext.php:32
 54. App\Http\Middleware\SentryContext-&gt;handle() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
 55. Illuminate\Pipeline\Pipeline-&gt;Illuminate\Pipeline\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
 56. Illuminate\Routing\Pipeline-&gt;Illuminate\Routing\{closure}() /Users/jack/Sites/website/vendor/fideloper/proxy/src/TrustProxies.php:57
 57. Fideloper\Proxy\TrustProxies-&gt;handle() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
 58. Illuminate\Pipeline\Pipeline-&gt;Illuminate\Pipeline\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
 59. Illuminate\Routing\Pipeline-&gt;Illuminate\Routing\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:31
 60. Illuminate\Foundation\Http\Middleware\TransformsRequest-&gt;handle() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
 61. Illuminate\Pipeline\Pipeline-&gt;Illuminate\Pipeline\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
 62. Illuminate\Routing\Pipeline-&gt;Illuminate\Routing\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php:31
 63. Illuminate\Foundation\Http\Middleware\TransformsRequest-&gt;handle() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
 64. Illuminate\Pipeline\Pipeline-&gt;Illuminate\Pipeline\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
 65. Illuminate\Routing\Pipeline-&gt;Illuminate\Routing\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php:27
 66. Illuminate\Foundation\Http\Middleware\ValidatePostSize-&gt;handle() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
 67. Illuminate\Pipeline\Pipeline-&gt;Illuminate\Pipeline\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
 68. Illuminate\Routing\Pipeline-&gt;Illuminate\Routing\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php:62
 69. Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode-&gt;handle() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:151
 70. Illuminate\Pipeline\Pipeline-&gt;Illuminate\Pipeline\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php:53
 71. Illuminate\Routing\Pipeline-&gt;Illuminate\Routing\{closure}() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php:104
 72. Illuminate\Pipeline\Pipeline-&gt;then() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:151
 73. Illuminate\Foundation\Http\Kernel-&gt;sendRequestThroughRouter() /Users/jack/Sites/website/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:116
 74. Illuminate\Foundation\Http\Kernel-&gt;handle() /Users/jack/Sites/website/public/index.php:53
 75. require() /Users/jack/.composer/vendor/laravel/valet/server.php:147

This occurs after I attempt to impersonate a user (either through the index view or in details view).

The collection given appears to be the user I'm trying to impersonate, and my own user model.

I'm wondering if this is a conflict or something? All I've done is require through composer, install, then add Impersonate::make($this->id) to my Nova User model.

Route caching

Could you please use controllers for the logic?

  1. More readability.
  2. I cannot cache my routes this way.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.