Roles via Nextcloud groups: sms-admin/manager/viewer + fix OAuth instance_uri
Deploy / deploy (push) Successful in 29s

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Malek TellissiandClaude Sonnet 4.6 committed 2026-09-13 01:48:24 +02:00
1 parent fc4579c47d
commit 2937004118
16 files changed
+506 -5

No files matched your search

@@ -2,6 +2,7 @@
namespace App\Filament\User\Resources;
use App\Traits\EnforcesRoles;
use App\Filament\User\Resources\PackingResource\Pages;
use App\Filament\User\Resources\PackingResource\RelationManagers;
use App\Models\Packing;
@@ -15,6 +16,7 @@ use Illuminate\Database\Eloquent\SoftDeletingScope;
class PackingResource extends Resource
{
use EnforcesRoles;
protected static ?string $model = Packing::class;
protected static ?string $navgationLabel = 'Verpackung & Größe';
protected static ?string $modelLabel = 'Verpackung & Größe';
@@ -2,6 +2,7 @@
namespace App\Filament\User\Resources;
use App\Traits\EnforcesRoles;
use App\Filament\User\Resources\ProductInventoryResource\Pages;
use Filament\Forms;
use Filament\Forms\Form;
@@ -17,6 +18,7 @@ use Illuminate\Support\Facades\DB;
class ProductInventoryResource extends Resource
{
use EnforcesRoles;
protected static ?string $model = ProductInventory::class;
protected static ?string $navigationIcon = 'heroicon-o-inbox';
@@ -2,6 +2,7 @@
namespace App\Filament\User\Resources;
use App\Traits\EnforcesRoles;
use App\Filament\User\Resources\ProductResource\Pages;
use App\Filament\User\Resources\ProductResource\RelationManagers;
use App\Models\Packing;
@@ -2,6 +2,7 @@
namespace App\Filament\User\Resources;
use App\Traits\EnforcesRoles;
use App\Filament\User\Resources\ProductSaleResource\Pages;
use App\Models\ProductSale;
use App\Models\Product;
@@ -2,6 +2,7 @@
namespace App\Filament\User\Resources;
use App\Traits\EnforcesRoles;
use App\Filament\User\Resources\SpiceResource\Pages;
use App\Filament\User\Resources\SpiceResource\RelationManagers;
use App\Models\Spice;
@@ -16,6 +17,7 @@ use Illuminate\Database\Eloquent\SoftDeletingScope;
class SpiceResource extends Resource
{
use EnforcesRoles;
protected static ?string $model = Spice::class;
protected static ?string $navgationLabel = 'Rohstoffe';
protected static ?string $modelLabel = 'Rohstoff';
@@ -2,6 +2,7 @@
namespace App\Filament\User\Resources;
use App\Traits\EnforcesRoles;
use App\Filament\User\Resources\SpiceSupplierResource\Pages;
use App\Filament\User\Resources\SpiceSupplierResource\RelationManagers;
use App\Models\SpiceSupplier;
@@ -23,6 +24,7 @@ use Filament\Tables\Columns\TextColumn;
class SpiceSupplierResource extends Resource
{
use EnforcesRoles;
protected static ?string $model = SpiceSupplier::class;
protected static ?string $navigationIcon = 'heroicon-o-arrow-down-on-square';
@@ -2,6 +2,7 @@
namespace App\Filament\User\Resources;
use App\Traits\EnforcesRoles;
use App\Filament\User\Resources\SupplierResource\Pages;
use App\Filament\User\Resources\SupplierResource\RelationManagers;
use App\Models\Supplier;
@@ -15,6 +16,7 @@ use Illuminate\Database\Eloquent\SoftDeletingScope;
class SupplierResource extends Resource
{
use EnforcesRoles;
protected static ?string $model = Supplier::class;
protected static ?string $navigationIcon = 'heroicon-o-user';
+9
View File
@@ -19,6 +19,13 @@ class OAuthController extends Controller
{
$socialUser = Socialite::driver('nextcloud')->user();
$ncGroups = $socialUser->getRaw()['ocs']['data']['groups'] ?? [];
$smsRoles = array_intersect($ncGroups, ['sms-admin', 'sms-manager', 'sms-viewer']);
if (empty($smsRoles)) {
abort(403, 'Kein Zugriff — bitte einer SMS-Gruppe in Nextcloud beitreten.');
}
$user = User::firstOrCreate(
['email' => $socialUser->getEmail()],
[
@@ -27,6 +34,8 @@ class OAuthController extends Controller
]
);
$user->syncRoles(array_values($smsRoles));
Auth::login($user, remember: true);
return redirect('/dashboard');
+3 -2
View File
@@ -7,10 +7,11 @@ use Filament\Panel;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable implements FilamentUser
{
use HasFactory, Notifiable;
use HasFactory, Notifiable, HasRoles;
/**
* The attributes that are mass assignable.
@@ -48,6 +49,6 @@ class User extends Authenticatable implements FilamentUser
public function canAccessPanel(Panel $panel): bool
{
return true; // allow all authenticated users access to the dashboard
return $this->hasAnyRole(['sms-admin', 'sms-manager', 'sms-viewer']);
}
}
+33
View File
@@ -0,0 +1,33 @@
<?php
namespace App\Traits;
use Illuminate\Database\Eloquent\Model;
trait EnforcesRoles
{
private static function canWrite(): bool
{
return auth()->user()?->hasAnyRole(['sms-admin', 'sms-manager']) ?? false;
}
public static function canCreate(): bool
{
return static::canWrite();
}
public static function canEdit(Model $record): bool
{
return static::canWrite();
}
public static function canDelete(Model $record): bool
{
return static::canWrite();
}
public static function canDeleteAny(): bool
{
return static::canWrite();
}
}