/
DATKAI
/
ITCUP
Обзор
Документация
Войти
/
DATKAI
/
ITCUP
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
app/Filament/Pages/AdSettings.php
146 строк
6 KB
ITCUP Admin
feat(ad): опция 'Игнорировать сертификат' для self-signed LDAPS/StartTLS
22 апр 2026, 11:04
22 апр 2026, 11:04
ec4d7f1
Код
Авторство
О чём код?
<?php namespace App\Filament\Pages; use App\Services\LdapService; use BackedEnum; use Filament\Actions\Action; use Filament\Forms\Components\TextInput; use Filament\Forms\Components\Toggle; use Filament\Forms\Concerns\InteractsWithForms; use Filament\Forms\Contracts\HasForms; use Filament\Notifications\Notification; use Filament\Pages\Page; use Filament\Schemas\Components\Section; use Filament\Schemas\Schema; use Filament\Support\Icons\Heroicon; class AdSettings extends Page implements HasForms { use InteractsWithForms; protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedServerStack; protected static ?string $navigationLabel = 'Active Directory'; protected static string|\UnitEnum|null $navigationGroup = 'Настройки'; protected static ?int $navigationSort = 10; protected static ?string $title = 'Настройки Active Directory'; protected string $view = 'filament.pages.ad-settings'; public ?array $data = []; public function mount(): void { $settings = app(LdapService::class)->getSettings(); // Пароль не загружаем в форму — только для установки/замены $settings['password'] = null; $this->form->fill($settings); } public function form(Schema $schema): Schema { return $schema ->components([ Section::make('Подключение к домену') ->description('Параметры для связи с контроллером домена Active Directory по LDAP') ->columns(2) ->schema([ TextInput::make('hosts') ->label('Серверы AD (через запятую)') ->placeholder('dc01.sibprofil3.com, dc02.sibprofil3.com') ->required() ->columnSpanFull() ->helperText('IP или доменные имена контроллеров. ITCUP будет перебирать по очереди.'), TextInput::make('base_dn') ->label('Base DN') ->placeholder('DC=sibprofil3,DC=com') ->required() ->columnSpanFull(), TextInput::make('username') ->label('Сервисный аккаунт') ->placeholder('itcup@sibprofil3.com или CN=itcup,OU=Service,DC=sibprofil3,DC=com') ->required() ->helperText('Рекомендуется отдельная учётка с правами чтения + создания пользователей в нужной OU'), TextInput::make('password') ->label('Пароль сервисного аккаунта') ->password() ->revealable() ->placeholder('••••••••') ->helperText('Хранится в БД в шифрованном виде. Оставьте пустым чтобы не менять'), TextInput::make('port') ->label('Порт') ->numeric() ->default(389) ->helperText('389 — стандартный LDAP, 636 — LDAPS (SSL)'), TextInput::make('timeout') ->label('Таймаут (сек)') ->numeric() ->default(5), Toggle::make('use_ssl') ->label('SSL (LDAPS)') ->helperText('Обычно порт 636'), Toggle::make('use_tls') ->label('StartTLS') ->helperText('Шифрование поверх обычного порта 389'), Toggle::make('ignore_cert') ->label('Игнорировать сертификат') ->helperText('Для self-signed или внутреннего CA. Соединение шифруется, но сертификат не проверяется.'), ]), Section::make('Импорт / синхронизация') ->columns(2) ->schema([ TextInput::make('default_ou') ->label('OU по умолчанию для создаваемых пользователей') ->placeholder('OU=Users,DC=sibprofil3,DC=com'), TextInput::make('group_dn') ->label('Фильтр групп (DN)') ->placeholder('OU=Groups,DC=sibprofil3,DC=com'), ]), ]) ->statePath('data'); } public function save(): void { $data = $this->form->getState(); app(LdapService::class)->saveSettings($data); Notification::make() ->title('Настройки сохранены') ->success() ->send(); } public function testConnection(): void { $this->save(); // сохраняем актуальные перед тестом $res = app(LdapService::class)->testConnection(); Notification::make() ->title($res['ok'] ? '✓ Подключение успешно' : '✗ Не удалось подключиться') ->body($res['message'] ?? '') ->color($res['ok'] ? 'success' : 'danger') ->duration(10000) ->send(); } protected function getFormActions(): array { return [ Action::make('save') ->label('Сохранить') ->icon('heroicon-o-check') ->submit('save'), Action::make('test') ->label('Проверить подключение') ->icon('heroicon-o-signal') ->color('gray') ->action('testConnection'), ]; } }