Директиви авторизації Blade для забезпечення безпеки перегляду

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 09 липня, 2025
Досліджуйте, як директиви авторизації Blade у Laravel можуть полегшити управління правами доступу у вашій програмі. Чи готові ви забезпечити відповідність між логікою відображення та авторизацією, щоб підвищити безпеку вашого інтерфейсу? Читайте далі, щоб дізнатися більше

Директиви авторизації Blade у Laravel чудово інтегруються з системою дозволів вашого застосунку, забезпечуючи чисте умовне рендерингування на основі можливостей користувача. Ці директиви підтримують узгодженість між авторизацією на бекенді та логікою відображення на фронтенді.

Blade пропонує три основні директиви авторизації для перевірки дозволів:

@can('edit', $article)
    <button class="edit-btn">Редагувати статтю</button>
@endcan

@cannot('delete', $article)
    <span class="text-muted">Видалення заборонено</span>
@endcannot

Директива @canany перевіряє кілька дозволів одночасно, що корисно в складних сценаріях авторизації.

@canany(['publish', 'schedule'], $article)
    <div class="publishing-controls">
        Доступні параметри публікації
    </div>
@endcanany

Ось приклад реалізації панелі управління, що демонструє різні шаблони авторизації:

<div class="dashboard-layout">
    <header class="dashboard-header">
        <h1>Управління контентом</h1>

        @canany(['create-posts', 'create-pages'])
            <div class="create-actions">
                @can('create-posts')
                    <a href="{{ route('posts.create') }}" class="btn btn-primary">Нова стаття</a>
                @endcan

                @can('create-pages')
                    <a href="{{ route('pages.create') }}" class="btn btn-secondary">Нова сторінка</a>
                @endcan
            </div>
        @endcanany
    </header>

    <main class="content-area">
        @foreach($articles as $article)
            <article class="content-card">
                <h2>{{ $article->title }}</h2>
                <p>{{ $article->excerpt }}</p>

                <div class="article-meta">
                    <span>Автор: {{ $article->author->name }}</span>
                    <span>{{ $article->published_at->diffForHumans() }}</span>
                </div>

                <div class="article-actions">
                    @can('update', $article)
                        <a href="{{ route('articles.edit', $article) }}" class="action-link">
                            Редагувати
                        </a>
                    @endcan

                    @can('publish', $article)
                        @if($article->is_draft)
                            <form method="POST" action="{{ route('articles.publish', $article) }}" class="inline-form">
                                @csrf
                                <button type="submit" class="publish-btn">Опублікувати</button>
                            </form>
                        @endif
                    @endcan

                    @cannot('delete', $article)
                        <span class="disabled-action">Видалення (захищено)</span>
                    @else
                        <form method="POST" action="{{ route('articles.destroy', $article) }}" class="inline-form">
                            @csrf
                            @method('DELETE')
                            <button type="submit" class="delete-btn" onclick="return confirm('Видалити цю статтю?')">
                                Видалити
                            </button>
                        </form>
                    @endcannot
                </div>
            </article>
        @endforeach
    </main>

    <aside class="sidebar">
        @canany(['view-analytics', 'manage-users', 'system-settings'])
            <div class="admin-panel">
                <h3>Адміністрування</h3>
                <ul class="admin-links">
                    @can('view-analytics')
                        <li><a href="{{ route('analytics.dashboard') }}">Аналітика</a></li>
                    @endcan

                    @can('manage-users')
                        <li><a href="{{ route('users.index') }}">Керування користувачами</a></li>
                    @endcan

                    @can('system-settings')
                        <li><a href="{{ route('settings.index') }}">Системні налаштування</a></li>
                    @endcan
                </ul>
            </div>
        @endcanany

        @guest
            <div class="login-prompt">
                <p>Будь ласка, <a href="{{ route('login') }}">увійдіть</a>, щоб отримати доступ до всіх функцій.</p>
            </div>
        @else
            @cannot('create-posts')
                <div class="upgrade-notice">
                    <p>Підвищте свій тарифний план, щоб створювати публікації.</p>
                    <a href="{{ route('plans.index') }}" class="upgrade-link">Переглянути плани</a>
                </div>
            @endcannot
        @endguest
    </aside>
</div>

Директиви авторизації гарантують, що елементи UI відповідають дозволам користувачів, створюючи безпечні та інтуїтивно зрозумілі інтерфейси, зменшуючи ризик несанкціонованого доступу до функціоналу