Skip to content

Commit 17bd446

Browse files
committed
wip
1 parent 4733e91 commit 17bd446

11 files changed

Lines changed: 104 additions & 0 deletions

File tree

README.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,38 @@ public function panel(Panel $panel): Panel
8585
}
8686
```
8787

88+
### Security
89+
90+
Using the `canManageMails()` method, you can define which users have access to the mail resources/pages. Here's a comprehensive example that includes additional logic for flexibility:
91+
92+
```php
93+
use Backstage\FilamentMails\FilamentMailsPlugin;
94+
use Illuminate\Support\Facades\Auth;
95+
96+
$panel
97+
->plugins([
98+
FilamentMailsPlugin::make()
99+
->canManageMails(function () {
100+
$user = Auth::user();
101+
102+
// Allow access for users with specific roles
103+
if ($user->hasRole('admin') || $user->hasRole('supervisor')) {
104+
return true;
105+
}
106+
107+
// Allow access for users with specific permissions
108+
if ($user->hasPermissionTo('manage mails')) {
109+
return true;
110+
}
111+
112+
// Restrict access for all other users
113+
return false;
114+
}),
115+
]);
116+
```
117+
118+
This example demonstrates how to combine role-based and permission-based access control, providing a more robust and flexible approach to managing access to mail resources.
119+
88120
### Tenant middleware and route protection
89121

90122
If you want to protect the mail routes with your (tenant) middleware, you can do so by adding the routes to the `tenantRoutes`:

src/FilamentMailsPlugin.php

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,15 @@
88
use Filament\Contracts\Plugin;
99
use Filament\Panel;
1010
use Filament\Support\Colors\Color;
11+
use Filament\Support\Concerns\EvaluatesClosures;
12+
use Closure;
1113

1214
class FilamentMailsPlugin implements Plugin
1315
{
16+
use EvaluatesClosures;
17+
18+
public bool | Closure $canManageMails = true;
19+
1420
public function getId(): string
1521
{
1622
return 'filament-mails';
@@ -46,4 +52,16 @@ public static function get(): static
4652

4753
return $plugin;
4854
}
55+
56+
public function canManageMails(bool | Closure $canManageMails = true): static
57+
{
58+
$this->canManageMails = $canManageMails;
59+
60+
return $this;
61+
}
62+
63+
public function userCanManageMails(): bool
64+
{
65+
return $this->evaluate($this->canManageMails);
66+
}
4967
}

src/Resources/EventResource.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use Backstage\FilamentMails\Resources\EventResource\Pages\ListEvents;
66
use Backstage\FilamentMails\Resources\EventResource\Pages\ViewEvent;
7+
use Backstage\FilamentMails\FilamentMailsPlugin;
78
use Backstage\Mails\Enums\EventType;
89
use Backstage\Mails\Models\MailEvent;
910
use Filament\Actions\BulkActionGroup;
@@ -24,6 +25,11 @@ class EventResource extends Resource
2425

2526
protected static bool $shouldRegisterNavigation = true;
2627

28+
public static function canAccess(): bool
29+
{
30+
return FilamentMailsPlugin::get()->userCanManageMails();
31+
}
32+
2733
public static function getSlug(?Panel $panel = null): string
2834
{
2935
return config('filament-mails.resources.mail')::getSlug() . '/events';

src/Resources/EventResource/Pages/ListEvents.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Backstage\FilamentMails\Resources\EventResource\Pages;
44

5+
use Backstage\FilamentMails\FilamentMailsPlugin;
56
use Backstage\FilamentMails\Resources\EventResource;
67
use Backstage\Mails\Enums\EventType;
78
use Backstage\Mails\Models\MailEvent;
@@ -11,6 +12,11 @@
1112

1213
class ListEvents extends ListRecords
1314
{
15+
public static function canAccess(array $parameters = []): bool
16+
{
17+
return FilamentMailsPlugin::get()->userCanManageMails();
18+
}
19+
1420
public static function getResource(): string
1521
{
1622
return config('filament-mails.resources.event', EventResource::class);

src/Resources/EventResource/Pages/ViewEvent.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,17 @@
22

33
namespace Backstage\FilamentMails\Resources\EventResource\Pages;
44

5+
use Backstage\FilamentMails\FilamentMailsPlugin;
56
use Backstage\FilamentMails\Resources\EventResource;
67
use Filament\Resources\Pages\ViewRecord;
78

89
class ViewEvent extends ViewRecord
910
{
11+
public static function canAccess(array $parameters = []): bool
12+
{
13+
return FilamentMailsPlugin::get()->userCanManageMails();
14+
}
15+
1016
public static function getResource(): string
1117
{
1218
return config('filament-mails.resources.event', EventResource::class);

src/Resources/MailResource.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use Backstage\FilamentMails\Resources\MailResource\Pages\ListMails;
66
use Backstage\FilamentMails\Resources\MailResource\Pages\ViewMail;
77
use Backstage\FilamentMails\Resources\MailResource\Widgets\MailStatsWidget;
8+
use Backstage\FilamentMails\FilamentMailsPlugin;
89
use Backstage\Mails\Actions\ResendMail;
910
use Backstage\Mails\Enums\EventType;
1011
use Backstage\Mails\Models\Mail;
@@ -45,6 +46,11 @@ class MailResource extends Resource
4546

4647
protected static bool $shouldRegisterNavigation = true;
4748

49+
public static function canAccess(): bool
50+
{
51+
return FilamentMailsPlugin::get()->userCanManageMails();
52+
}
53+
4854
public static function getModel(): string
4955
{
5056
return config('mails.models.mail');

src/Resources/MailResource/Pages/ListMails.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,19 @@
44

55
use Backstage\FilamentMails\Resources\MailResource;
66
use Backstage\FilamentMails\Resources\MailResource\Widgets\MailStatsWidget;
7+
use Backstage\FilamentMails\FilamentMailsPlugin;
78
use Backstage\Mails\Models\Mail;
89
use Filament\Resources\Pages\ListRecords;
910
use Filament\Schemas\Components\Tabs\Tab;
1011
use Illuminate\Database\Eloquent\Builder;
1112

1213
class ListMails extends ListRecords
1314
{
15+
public static function canAccess(array $parameters = []): bool
16+
{
17+
return FilamentMailsPlugin::get()->userCanManageMails();
18+
}
19+
1420
public static function getResource(): string
1521
{
1622
return config('filament-mails.resources.mail', MailResource::class);

src/Resources/MailResource/Pages/ViewMail.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,17 @@
22

33
namespace Backstage\FilamentMails\Resources\MailResource\Pages;
44

5+
use Backstage\FilamentMails\FilamentMailsPlugin;
56
use Backstage\FilamentMails\Resources\MailResource;
67
use Filament\Resources\Pages\ViewRecord;
78

89
class ViewMail extends ViewRecord
910
{
11+
public static function canAccess(array $parameters = []): bool
12+
{
13+
return FilamentMailsPlugin::get()->userCanManageMails();
14+
}
15+
1016
public static function getResource(): string
1117
{
1218
return config('filament-mails.resources.mail', MailResource::class);

src/Resources/MailResource/Widgets/MailStatsWidget.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Backstage\FilamentMails\Resources\MailResource\Widgets;
44

5+
use Backstage\FilamentMails\FilamentMailsPlugin;
56
use Filament\Facades\Filament;
67
use Filament\Widgets\StatsOverviewWidget as BaseWidget;
78
use Filament\Widgets\StatsOverviewWidget\Stat;
@@ -12,6 +13,11 @@ class MailStatsWidget extends BaseWidget
1213

1314
protected static bool $isDiscovered = false;
1415

16+
public static function canView(): bool
17+
{
18+
return FilamentMailsPlugin::get()->userCanManageMails();
19+
}
20+
1521
protected function getStats(): array
1622
{
1723
$class = config('mails.models.mail');

src/Resources/SuppressionResource.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Backstage\FilamentMails\Resources;
44

55
use Backstage\FilamentMails\Resources\SuppressionResource\Pages\ListSuppressions;
6+
use Backstage\FilamentMails\FilamentMailsPlugin;
67
use Backstage\Mails\Enums\EventType;
78
use Backstage\Mails\Enums\Provider;
89
use Backstage\Mails\Events\MailUnsuppressed;
@@ -22,6 +23,11 @@ class SuppressionResource extends Resource
2223

2324
protected static bool $shouldRegisterNavigation = true;
2425

26+
public static function canAccess(): bool
27+
{
28+
return FilamentMailsPlugin::get()->userCanManageMails();
29+
}
30+
2531
public static function getSlug(?Panel $panel = null): string
2632
{
2733
return config('filament-mails.resources.mail')::getSlug() . '/suppressions';

0 commit comments

Comments
 (0)