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

0
Перекладено ШІ
Оригінал: 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 відповідають дозволам користувачів, створюючи безпечні та інтуїтивно зрозумілі інтерфейси, зменшуючи ризик несанкціонованого доступу до функціоналу

Популярні

Logomark Logotype

Як задокументувати кілька API в Laravel за допомогою Scramble

Ви знали, що в одному додатку Laravel можна реалізувати кілька API? У нашій статті ви дізнаєтеся, як за допомогою Scramble легко документувати різні версії API та налаштувати доступ до документації, щоб зробити її публічною або приватною. Читайте далі, щоб дізнатися більше

Logomark Logotype

Використання повнотекстового пошуку в Laravel

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

Logomark Logotype

"SQLSTATE[HY000] [2002] Connection refused" у Laravel в GitHub Actions

Чи стикалися ви з помилкою «SQLSTATE[HY000] [2002] Connection refused» під час налаштування GitHub Actions для вашого додатку на Laravel? У нашій статті ми розглянемо три поширені причини цієї помилки та надамо рішення для їх усунення. Читайте далі, щоб дізнатися, як ваш CI/CD потік може працювати бездоганно!