Skip to content

Commit 1e3e710

Browse files
committed
feat!: Updated auth plugin to use filament plugin interface
1 parent dad492b commit 1e3e710

23 files changed

+202
-89
lines changed

routes/web.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@
55

66
Route::get('/impersonate/stop', fn () => ImpersonateLink::leave())
77
->name('filament-authentication.stop.impersonation')
8-
->middleware(config('filament-authentication.impersonate.guard'));
8+
->middleware('web');

src/Actions/ImpersonateLink.php

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
use Illuminate\Http\RedirectResponse;
99
use Lab404\Impersonate\Services\ImpersonateManager;
1010
use Illuminate\Contracts\Auth\Authenticatable as User;
11-
11+
use Phpsa\FilamentAuthentication\FilamentAuthentication;
1212

1313
class ImpersonateLink
1414
{
@@ -30,7 +30,8 @@ public static function make(): Action
3030
*/
3131
public static function allowed(User $current, User $target): bool
3232
{
33-
return config('filament-authentication.impersonate.enabled', false)
33+
$enabled = FilamentAuthentication::getPlugin()->impersonateEnabled();
34+
return $enabled
3435
&& $current->isNot($target)
3536
&& ! app(ImpersonateManager::class)->isImpersonating()
3637
&& (! method_exists($current, 'canImpersonate') || $current->canImpersonate())
@@ -46,32 +47,35 @@ public static function impersonate(User $record): false|Redirector|RedirectRespo
4647
app(ImpersonateManager::class)->take(
4748
Filament::auth()->user(),
4849
$record,
49-
config('filament-authentication.impersonate.guard', 'web')
50+
FilamentAuthentication::getPlugin()->getImpersonateGuard()
5051
);
5152

53+
session()->put('impersonate.back_to', url()->previous());
54+
5255
session()->forget(array_unique([
53-
'password_hash_'.config('filament-authentication.impersonate.guard', 'web'),
54-
'password_hash_'.config('filament.auth.guard'),
56+
'password_hash_' . FilamentAuthentication::getPlugin()->getImpersonateGuard(),
57+
'password_hash_' . config('filament.auth.guard'),
5558
]));
5659

57-
return redirect(config('filament-authentication.impersonate.redirect', '/'));
60+
return redirect(FilamentAuthentication::getPlugin()->getImpersonateRedirect());
5861
}
5962

6063
public static function leave(): Redirector|RedirectResponse
6164
{
65+
6266
if (! app(ImpersonateManager::class)->isImpersonating()) {
6367
return redirect('/');
6468
}
6569

6670
app(ImpersonateManager::class)->leave();
6771

6872
session()->forget(array_unique([
69-
'password_hash_'.config('filament-authentication.impersonate.guard'),
70-
'password_hash_'.config('filament.auth.guard'),
73+
'password_hash_' . FilamentAuthentication::getPlugin()->getImpersonateGuard(),
74+
'password_hash_' . config('filament.auth.guard'),
7175
]));
7276

7377
return redirect(
74-
session()->pull('impersonate.back_to') ?? config('filament.path')
78+
session()->pull('impersonate.back_to') ?? '/'
7579
);
7680
}
7781
}

src/FilamentAuthentication.php

Lines changed: 137 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,146 @@
22

33
namespace Phpsa\FilamentAuthentication;
44

5-
use Filament\Navigation\MenuItem;
5+
use Closure;
66
use Filament\Panel;
7+
use App\Models\User;
8+
use Filament\Contracts\Plugin;
9+
use Spatie\Permission\Models\Role;
10+
use Filament\Tables\Columns\TextColumn;
11+
use Spatie\Permission\Models\Permission;
12+
use Phpsa\FilamentAuthentication\Resources\RoleResource;
13+
use Phpsa\FilamentAuthentication\Resources\UserResource;
14+
use Phpsa\FilamentAuthentication\Resources\PermissionResource;
15+
use Phpsa\FilamentAuthentication\Http\Middleware\ImpersonatingMiddleware;
716

8-
class FilamentAuthentication
17+
class FilamentAuthentication implements Plugin
918
{
10-
public static function resources(array $with = []): array
19+
protected bool $preloadRoles = true;
20+
protected bool $preloadPermissions = true;
21+
protected bool $impersonate = false;
22+
protected string $impersonateGuard = 'web';
23+
protected string|Closure $impersonateRedirect = '/';
24+
25+
/**
26+
* @var array<string, class-string>
27+
*/
28+
protected array $models = [
29+
'User' => User::class,
30+
'Role' => Role::class,
31+
'Permission' => Permission::class,
32+
];
33+
34+
/**
35+
* @var array<string, class-string>
36+
*/
37+
protected array $resources = [
38+
'UserResource' => UserResource::class,
39+
'RoleResource' => RoleResource::class,
40+
'PermissionResource' => PermissionResource::class,
41+
];
42+
43+
public static function make(): self
44+
{
45+
return new static();
46+
}
47+
48+
public static function getPlugin(): self
49+
{
50+
return filament('filament-authentication');
51+
}
52+
53+
public function getId(): string
54+
{
55+
return 'filament-authentication';
56+
}
57+
58+
public function register(Panel $panel): void
59+
{
60+
$panel->resources($this->resources);
61+
$panel->middleware([ImpersonatingMiddleware::class]);
62+
}
63+
64+
public function boot(Panel $panel): void
65+
{
66+
TextColumn::macro('humanDate', function () {
67+
/** @var \Filament\Tables\Columns\TextColumn&\Filament\Tables\Columns\Concerns\CanFormatState $this */
68+
$this->formatStateUsing(fn ($state): ?string => $state ? $state->diffForHumans() : null);
69+
70+
return $this;
71+
});
72+
}
73+
74+
public function setPreload(bool $roles = true, bool $permissions = true): self
75+
{
76+
$this->preloadRoles = $roles;
77+
$this->preloadPermissions = $permissions;
78+
79+
return $this;
80+
}
81+
82+
public function getPreloadRoles(): bool
83+
{
84+
return $this->preloadRoles;
85+
}
86+
87+
public function getPreloadPermissions(): bool
88+
{
89+
return $this->preloadPermissions;
90+
}
91+
92+
public function setImpersonation(bool $enabled = true, string $guard = 'web', string|Closure $redirect = '/'): self
93+
{
94+
$this->impersonate = $enabled;
95+
$this->impersonateGuard = $guard;
96+
$this->impersonateRedirect = $redirect;
97+
98+
return $this;
99+
}
100+
101+
public function impersonateEnabled(): bool
102+
{
103+
return $this->impersonate;
104+
}
105+
106+
public function getImpersonateGuard(): string
107+
{
108+
return $this->impersonateGuard;
109+
}
110+
111+
public function getImpersonateRedirect(): string|Closure
112+
{
113+
$value = $this->impersonateRedirect;
114+
if (! $value instanceof Closure) {
115+
return $value;
116+
}
117+
return $value();
118+
}
119+
120+
/**
121+
* @param array<string,class-string> $overrides
122+
*/
123+
public function overrideModels(array $overrides): self
124+
{
125+
$this->models = array_merge($this->models, $overrides);
126+
return $this;
127+
}
128+
129+
public function getModel(string $model): string
130+
{
131+
return $this->models[$model];
132+
}
133+
134+
/**
135+
* @param array<string,class-string> $overrides
136+
*/
137+
public function overrideResources(array $overrides): self
138+
{
139+
$this->resources = array_merge($this->resources, $overrides);
140+
return $this;
141+
}
142+
143+
public function getResource(string $resource): string
11144
{
12-
return array_merge(
13-
config('filament-authentication.resources'),
14-
$with
15-
);
145+
return $this->resources[$resource];
16146
}
17147
}

src/FilamentAuthenticationProvider.php

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -15,44 +15,12 @@ class FilamentAuthenticationProvider extends PackageServiceProvider
1515
{
1616
public static string $name = 'filament-authentication';
1717

18-
protected array $widgets = [
19-
LatestUsersWidget::class,
20-
];
21-
22-
protected function getResources(): array
23-
{
24-
return config('filament-authentication.resources');
25-
}
26-
27-
protected function getWidgets(): array
28-
{
29-
return config('filament-authentication.resources.widgets');
30-
}
3118

3219
public function configurePackage(Package $package): void
3320
{
34-
Config::push('filament.middleware.base', ImpersonatingMiddleware::class);
35-
3621
$package->name('filament-authentication')
37-
->hasConfigFile()
3822
->hasViews()
3923
->hasRoute('web')
4024
->hasTranslations();
4125
}
42-
43-
public function getPages(): array
44-
{
45-
return config('filament-authentication.pages');
46-
}
47-
48-
public function packageRegistered(): void
49-
{
50-
51-
TextColumn::macro('humanDate', function () {
52-
/** @var \Filament\Tables\Columns\TextColumn&\Filament\Tables\Columns\Concerns\CanFormatState $this */
53-
$this->formatStateUsing(fn ($state): ?string => $state ? $state->diffForHumans() : null);
54-
55-
return $this;
56-
});
57-
}
5826
}

src/Http/Middleware/ImpersonatingMiddleware.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public function handle(Request $request, \Closure $next)
2424
$response->setContent(
2525
str_replace(
2626
'</body>',
27-
$this->getHtmlContent($request).'</body>',
27+
$this->getHtmlContent($request) . '</body>',
2828
// @phpstan-ignore-next-line
2929
$response->getContent()
3030
)

src/Resources/PermissionResource.php

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Filament\Tables\Actions\DeleteBulkAction;
1616
use Filament\Forms\Components\Section as Card;
1717
use Filament\Forms\Components\BelongsToManyMultiSelect;
18+
use Phpsa\FilamentAuthentication\FilamentAuthentication;
1819
use Phpsa\FilamentAuthentication\Resources\PermissionResource\Pages\EditPermission;
1920
use Phpsa\FilamentAuthentication\Resources\PermissionResource\Pages\ViewPermission;
2021
use Phpsa\FilamentAuthentication\Resources\PermissionResource\Pages\ListPermissions;
@@ -29,7 +30,7 @@ class PermissionResource extends Resource
2930

3031
public function __construct()
3132
{
32-
static::$model = config('filament-authentication.models.Permission');
33+
static::$model = FilamentAuthentication::getPlugin()->getModel('Permission');
3334
}
3435

3536
public static function getLabel(): string
@@ -61,10 +62,7 @@ public static function form(Form $form): Form
6162
->required()
6263
->label(strval(__('filament-authentication::filament-authentication.field.guard_name')))
6364
->default(config('auth.defaults.guard')),
64-
// BelongsToManyMultiSelect::make('roles')
65-
// ->label(strval(__('filament-authentication::filament-authentication.field.roles')))
66-
// ->relationship('roles', 'name')
67-
// ->preload(config('filament-spatie-roles-permissions.preload_roles'))
65+
6866
]),
6967
]),
7068
]);

src/Resources/PermissionResource/Pages/CreatePermission.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,17 @@
22

33
namespace Phpsa\FilamentAuthentication\Resources\PermissionResource\Pages;
44

5-
use Filament\Resources\Pages\CreateRecord;
65
use Illuminate\Support\Facades\Config;
7-
use Spatie\Permission\Contracts\Permission;
6+
use Filament\Resources\Pages\CreateRecord;
87
use Spatie\Permission\PermissionRegistrar;
8+
use Spatie\Permission\Contracts\Permission;
9+
use Phpsa\FilamentAuthentication\FilamentAuthentication;
910

1011
class CreatePermission extends CreateRecord
1112
{
1213
public static function getResource(): string
1314
{
14-
return Config::get('filament-authentication.resources.PermissionResource');
15+
return FilamentAuthentication::getPlugin()->getResource('PermissionResource');
1516
}
1617

1718
public function afterSave(): void

src/Resources/PermissionResource/Pages/EditPermission.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@
88
use Filament\Resources\Pages\EditRecord;
99
use Spatie\Permission\PermissionRegistrar;
1010
use Spatie\Permission\Contracts\Permission;
11+
use Phpsa\FilamentAuthentication\FilamentAuthentication;
1112

1213
class EditPermission extends EditRecord
1314
{
1415
public static function getResource(): string
1516
{
16-
return Config::get('filament-authentication.resources.PermissionResource');
17+
return FilamentAuthentication::getPlugin()->getResource('PermissionResource');
1718
}
1819

1920
public function afterSave(): void

src/Resources/PermissionResource/Pages/ListPermissions.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,13 @@
88
use Filament\Tables\Actions\BulkAction;
99
use Filament\Resources\Pages\ListRecords;
1010
use Illuminate\Database\Eloquent\Collection;
11+
use Phpsa\FilamentAuthentication\FilamentAuthentication;
1112

1213
class ListPermissions extends ListRecords
1314
{
1415
public static function getResource(): string
1516
{
16-
return Config::get('filament-authentication.resources.PermissionResource');
17+
return FilamentAuthentication::getPlugin()->getResource('PermissionResource');
1718
}
1819

1920
protected function getHeaderActions(): array

src/Resources/PermissionResource/Pages/ViewPermission.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@
55
use Filament\Actions\EditAction;
66
use Illuminate\Support\Facades\Config;
77
use Filament\Resources\Pages\ViewRecord;
8+
use Phpsa\FilamentAuthentication\FilamentAuthentication;
89

910
class ViewPermission extends ViewRecord
1011
{
1112
public static function getResource(): string
1213
{
13-
return Config::get('filament-authentication.resources.PermissionResource');
14+
return FilamentAuthentication::getPlugin()->getResource('PermissionResource');
1415
}
1516

1617
protected function getHeaderActions(): array

src/Resources/PermissionResource/RelationManager/RoleRelationManager.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Spatie\Permission\PermissionRegistrar;
1313
use Filament\Tables\Actions\DissociateBulkAction;
1414
use Filament\Resources\RelationManagers\RelationManager;
15+
use Phpsa\FilamentAuthentication\FilamentAuthentication;
1516

1617
class RoleRelationManager extends RelationManager
1718
{
@@ -44,7 +45,7 @@ public function table(Table $table): Table
4445
])
4546
->headerActions([
4647
CreateAction::make(),
47-
AttachAction::make()->preloadRecordSelect(config('filament-authentication.preload_roles', true))
48+
AttachAction::make()->preloadRecordSelect(FilamentAuthentication::getPlugin()->getPreloadRoles())
4849
->recordSelect(fn($select) => $select->multiple())
4950
->closeModalByClickingAway(false),
5051
])

0 commit comments

Comments
 (0)