Teknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor Haberleri
Yazı Tipi BoyutlandırıcıAa
  • Anasayfa
  • Teknoloji
    • Siber Güvenlik
    • Yapay Zeka
    • Donanım
    • Bilim
  • Yazılım
  • Savunma & İstihbarat
  • Oyun
  • Yaşam
    • Finans
    • Sinema
    • Dünyadan Haberler
  • İş Birliği
Okuma: Kullanım Senaryolarında Yetkilendirme, Kontrolörlerde Değil
Paylaş
Yazı Tipi BoyutlandırıcıAa
Teknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor Haberleri
Ara
Bizi Takip Et
  • Hakkımızda
  • Gizlilik politikası
  • Tanıtım Yazısı ve Backlink Hizmeti
© 2026 Teknomers. All Rights Reserved.

Anasayfa » Kullanım Senaryolarında Yetkilendirme, Kontrolörlerde Değil

Yazılım

Kullanım Senaryolarında Yetkilendirme, Kontrolörlerde Değil

teknomers
Son güncelleme: 20 Mayıs 2026 03:39
teknomers
Paylaş
Paylaş

Özellik tamamlandı. HTTP rotası güvenli hale getirildi. Kontrolörün üst kısmında bir Gate::authorize('refund', $order) satırı var. Kod incelemesi geçti. Laravel Policy birim testlerine sahip. Her şey yeşil ışıkta.

Altı ay sonra biri bir Jira biletini açar: “arkadaşlar, back-office CLI’den siparişleri iade etmemiz gerekiyor.” İki hafta sonra, ödeme sağlayıcısı iade işlemleri tamamlandığında aynı sipariş durumunu değiştirmek için web kancaları göndermeye başlar. Bir kuyruk işçisi, başarısız iadeleri topluca denemek için ortaya çıkar.

Üç yeni giriş noktasına sahibiz. Aynı iş operasyonu. Aynı yetkilendirme kuralları. Kontrolör bu noktaların birine sahip. Diğer üçü ya Policy çağrısını kopyala-yapıştır yapar ya da (daha sık olarak) tamamen unutarak, herhangi bir kabuk erişimi olan bir operatörün herkesin siparişini kontrolünü yapmadan iade etmesine izin veren bir php artisan refund:order komutu yayınlar.

Yetkilendirme mantığı yanlış katmanda yer alıyordu. İşte tüm sorun budur. Ve bu, çerçevenin kendi kuralları tarafından sizi bu şekilde yönlendirmektir.

Yanlış katmanı öğreten çerçeve örneği

Yetkilendirme için Laravel belgelerini açın. Kanonik örnek, kontrolörde kontrolü yerleştiriyor:

namespace App\Http\Controllers;

use App\Models\Order; use Illuminate\Http\Request;

final class RefundController { public function store(Request $request, Order $order) { $this->authorize('refund', $order);

    <span class="nv">$order</span><span class="o">-&gt;</span><span class="nf">refund</span><span class="p">(</span><span class="nv">$request</span><span class="o">-&gt;</span><span class="nf">integer</span><span class="p">(</span><span class="s1>'amount_cents'</span><span class="p">));</span>

    <span class="k">return</span> <span class="nf">response</span><span class="p">()</span><span class="o">-&gt;</span><span class="nf">noContent</span><span class="p">();</span>
<span class="p">}</span>

}

Enter fullscreen mode
<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title>
<path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"/>

Symfony belgeleri de aynı şeyi, Voters ve kontrolör yönteminde #[IsGranted] niteliği ile yapar:

namespace App\Controller;

use App\Entity\Order; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Security\Http\Attribute\IsGranted;

final class RefundController extends AbstractController { #[Route('/orders/{id}/refund', methods: ['POST'])] #[IsGranted('REFUND', subject: 'order')] public function refund(Order $order, Request $request): Response { $amount = (int) $request->request->get('amount_cents'); $order->refund($amount);

    <span class="k">return</span> <span class="k">new</span> <span class="nc">Response</span><span class="p">(</span><span class="s1">''</span><span class="p">,</span> <span class="nc">Response</span><span class="o">::</span><span class="no">HTTP_NO_CONTENT</span><span class="p">);</span>
<span class="p">}</span>

}

Enter fullscreen mode
<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title>
<path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"/>

Her iki örnek de HTTP katmanı açısından doğru, ancak yanlışı öğretiyor.

Kontrolör bir adaptördir. HTTP isteğini uygulamanıza bir çağrı olarak çevirmektedir. “Sadece bir yönetici 500 EUR üzerinde bir siparişi iade edebilir” kuralını adaptörün içine yerleştirmek, bu kuralın HTTP nedeniyle var olduğu anlamına gelir. Ancak bu doğru değil. Kural, iş ihtiyacı nedeniyle var olmaktadır. HTTP, kuralın geçerli olduğu odalardan yalnızca biridir.

İkinci giriş noktasının geldiği gün

Aynı RefundOrder işlemi php artisan aracılığıyla erişildiğinde, hiçbir middleware yok. $request->user() yok. Hiçbir Policy çağrısı yok, çünkü Symfony veya Laravel örneği, mühendise yetkilendirme kontrolünün nerede olması gerektiğini söylemedi.

namespace App\Console\Commands;

use App\Models\Order; use Illuminate\Console\Command;

final class RefundOrderCommand extends Command { protected $signature = 'refund:order {order_id} {amount_cents : Refund amount in cents} {--operator= : Operator initiating the refund}';

<span class="k">public</span> <span class="k">function</span> <span class="n">handle</span><span class="p">():</span> <span class="kt">int</span>
<span class="p">{</span>
    <span class="nv">$order</span> <span class="o">=</span> <span class="nc">Order</span><span class="o">::</span><span class="nf">findOrFail</span><span class="p">(</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="nf">argument</span><span class="p">(</span><span class="s1>'order_id'</span><span class="p">));</span>
    <span class="nv">$order</span><span class="o">-&gt;</span><span class="nf">refund</span><span class="p">(</span><span class="p>(</span><span class="n">int</span><span class="p">)</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="nf">argument</span><span class="p">(</span><span class="s1>'amount_cents'</span><span class="p">));</span>

    <span class="nv">$this</span><span class="o">-&gt;</span><span class="nf">info</span><span class="p">(</span><span class="s2'>"Refunded </span><span class="si">{</span><span class="nv">$order</span><span class="o">-&gt;</span><span class="n">id</span><span class="si">}</span><span class="s2}>"</span><span class="p">);</span>
    <span class="k">return</span> <span class="k">self</span><span class="o">::</span><span class="no">SUCCESS</span><span class="p">;</span>
<span class="p">}</span>

}

Enter fullscreen mode
<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title>
<path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"/>

Burada --operator= bayrağı yalnızca bilgilendiricidir. Bu kodda, operatörün izinli olduğunu doğrulayan hiçbir şey yoktur. Kutunun üzerinde shell erişimi olan herkes, her şeyi iade edebilir. HTTP rotasını yönetmek için bir Policy çağrısı yapılmamaktadır. Voter çağrısı yapılmamaktadır. authorize() yardımcı işlevi bile mevcut değildir — bir konsol bağlamında Auth::user() set edilmediği sürece.

Aynı açık, bir kuyruk işçisinin başka bir yerden gönderdiğiniz RefundOrderJob işlemini gerçekleştirdiğinde ve bir yanıtın güvenilir olduğunu düşündüğünüzde ödeme sağlayıcısından gelen inbound webhook’un doğrudan OrderService::refund() çağrısı yaptığında da mevcuttur. Webhook işleyici kontrolü, CLI’den üç ay sonra yayınlamaktadır.

OWASP API Security Top 10 (2023), “bozuk işlev düzeyinde yetkilendirme” riskini #5 olarak listeliyor. Desen tam olarak budur: kural yalnızca kamu HTTP yolunda bulunuyor ve bir iç yol bunu atlıyor.

Kuralı bulunduğu yere taşıyın

Bir kullanım durumu, tek bir iş operasyonudur. Bunu yöneten kural, içinde yer almalıdır. Kural “sadece yöneticiler 500 EUR’dan fazla iade yapabilir” ise, bu RefundOrder içine yerleştirilmelidir, kapıların üstüne değil.

Üç bileşen:

  1. AuthorizationPort: bir kullanım durumunun bağımlı olduğu bir arayüz. Auth::user(), JWT’ler, oturumlar veya HTTP başlıkları hakkında hiçbir şey bilmez. Sadece “bu aktör, bu konu üzerinde bu eylemi yapabilir mi?” sorusuna cevap verir.
  2. Bir Actor değer nesnesi: kim sordu. Her adaptör kendine özgü bir şekilde inşa eder (HTTP, oturumdan, CLI, OS kullanıcısından, kuyruk, işi gönderen kişiden, webhook, doğrulanmış bir imza ve bir hizmet kimliği).
  3. İş durumu: değiştiren işlemi yapmadan önce bir Actor‘ı girdi olarak alır ve porta çağrı yapar.
namespace App\Domain\Auth;

interface AuthorizationPort {

public function authorize(Actor $actor, string $action, object $subject): void; }

final readonly class Actor { public function __construct( public string $id, public string $kind, public array $roles, ) {}

<span class="k">public</span> <span class="k">static</span> <span class="k">function</span> <span class="n">system</span><span class="p">(</span><span class="kt">string</span> <span class="nv">$name</span><span class="p">):</span> <span class="kt">self</span>
<span class="p">{</span>
    <span class="k">return</span> <span class="k">new</span> <span class="nc">self</span><span class="p">(</span><span class="n">id</span><span class="o">:</span> <span class="s2">"system:</span><span class="si">{</span><span class="nv">$name</span><span class="si">}</span><span class="s2">"</span><span class="p">,</span> <span class="n">kind</span><span class="o">:</span> <span class="s1>'system'</span><span class="p">,</span> <span class="n">roles</span><span class="o">:</span> <span class="p">[</span><span class="s1>'system'</span><span class="p">]);</span>
<span class="p">}</span>

}

final class NotAuthorized extends \DomainException {}

Enter fullscreen mode
<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title>
<path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"/>

Actor::system(), ödeme sağlayıcı webhook gibi, çağrının bir insan yerine doğrulanmış bir hizmet olduğu durumlar için bir çıkış kapısıdır. Hala aynı porta geçiş yapar; yalnızca system‘in hangi yetkilere sahip olduğunu gösteren bir aktör üretir. Port, system‘in ne yapabileceğini belirler, tıpkı manager‘ın ne yapabileceğini belirlediği gibi.

Kullanım durumu aşağıdaki gibi görünür:

namespace App\UseCase;

use App\Domain\Auth\Actor; use App\Domain\Auth\AuthorizationPort; use App\Domain\Order\OrderRepository;

final readonly class RefundOrder { public function __construct( private OrderRepository $orders, private AuthorizationPort $auth, ) {}

<span class="k">public</span> <span class="k">function</span> <span class="n">execute</span><span class="p">(</span>
    <span class="kt">Actor</span> <span class="nv">$actor</span><span class="p">,</span>
    <span class="kt">string</span> <span class="nv">$orderId</span><span class="p">,</span>
    <span class="kt">int</span> <span class="nv">$amountCents</span><span class="p">,</span>
<span class="p">):</span> <span class="kt">void</span> <span class="p">{</span>
    <span class="nv">$order</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="n">orders</span><span class="o">-&gt;</span><span class="nf">getById</span><span class="p">(</span><span class="nv">$orderId</span><span class="p">);</span>

    <span class="nv">$this</span><span class="o">-&gt;</span><span class="n">auth</span><span class="o">-&gt;</span><span class="nf">authorize</span><span class="p">(</span><span class="nv">$actor</span><span class="p">,</span> <span class="s1>'order.refund'</span><span class="p">,</span> <span class="nv">$order</span><span class="p">);</span>

    <span class="nv">$order</span><span class="o">-&gt;</span><span class="nf">refund</span><span class="p">(</span><span class="nv">$amountCents</span><span class="p">);</span>
    <span class="nv">$this</span><span class="o">-&gt;</span><span class="n">orders</span><span class="o">-&gt;</span><span class="nf">save</span><span class="p">(</span><span class="nv">$order</span><span class="p">);</span>
<span class="p">}</span>

}

Enter fullscreen mode
<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title>
<path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"/>

Tek bir yetkilendirme satırı. Kim çağırırsa çağırsın çalışır. Kullanım durumu HTTP’nin var olduğunu bilmez; Artisan’ın var olduğunu bilmez; bir kuyruğun var olduğunu bilmez. Bir Actor, bir siparişi ve bir port bilmektedir.

Kullanım durumu merkezde yer almaktadır; bir raw `auth->authorize()` çağrısı; HTTP, CLI, kuyruk ve webhook adaptörleri her biri bir Actor üretir ve bu kullanım durumuna iletir.

Adaptör (Laravel Policy), portu uygular

Laravel Policy yok olmuyor. Portun arkasına taşınıyor. Aynı kod, farklı çağrıcı:

namespace App\Infrastructure\Auth;

use App\Domain\Auth\Actor; use App\Domain\Auth\AuthorizationPort; use App\Domain\Auth\NotAuthorized; use App\Models\Order; use App\Policies\OrderPolicy;

final readonly class LaravelPolicyAuthorization implements AuthorizationPort { public function __construct(private OrderPolicy $policy) {}

<span class="k">public</span> <span class="k">function</span> <span class="n">authorize</span><span class="p">(</span><span class="kt">Actor</span> <span class="nv">$actor</span><span class="p">,</span> <span class="kt">string</span> <span class="nv">$action</span><span class="p">,</span> <span class="kt">object</span> <span class="nv">$subject</span><span class="p">):</span> <span class="kt">void</span>
<span class="p">{</span>
    <span class="nv">$allowed</span> <span class="o">=</span> <span class="k">match</span><span class="p">(</span><span class="kc">true</span><span class="p">)</span> <span class="p">{</span>
        <span class="nv">$action</span> <span class="o">===</span> <span class="s1>'order.refund'</span> <span class="o">&amp;&amp;</span> <span class="nv">$subject</span> <span class="k">instanceof</span> <span class="nc">Order</span>
            <span class="o">=&gt;</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="n">policy</span><span class="o">-&gt;</span><span class="nf">refund</span><span class="p">(</span><span class="nv">$actor</span><span class="p">,</span> <span class="nv">$subject</span><span class="p">),</span>
        <span class="k">default</span> <span class="o">=&gt;</span> <span class="kc">false</span><span class="p">,</span>
    <span class="p">};</span>

    <span class="k">if</span> <span class="p">(</span><span class="o">!</span> <span class="nv">$allowed</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">throw</span> <span class="k">new</span> <span class="nc">NotAuthorized</span><span class="p">(</span><span class="s2">"</span><span class="si}>{</span><span class="nv">$actor</span><span class="o">-&gt;</span><span class="n">id</span><span class="si">}</span><span class="s2"> cannot </span><span class="si}>{</span><span class="nv">$action</span><span class="si">}</span><span class="s2">"</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>

}

Enter fullscreen mode
<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title>
<path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"/>

Policy, yöneticiler, iade limitleri, bölgesel kısıtlamalar gibi iş kurallarını kodlar. Şimdi, kullanım durumundan çağrılmaktadır, kontrolörden değil. Symfony Voters da aynı şekilde çalışır: Security::isGranted()‘i (veya doğrudan oylamayı) bir AuthorizationPort uygulaması içine sarın ve konteynere bağlayın.

Kontrolör, saf bir yönlendirme haline gelir:

final class RefundController
{
    public function __construct(private RefundOrder $useCase) {}
<span class="k">public</span> <span class="k">function</span> <span class="n">store</span><span class="p">(</span><span class="kt">Request</span> <span class="nv">$request</span><span class="p">,</span> <span class="kt">string</span> <span class="nv">$orderId</span><span class="p">):</span> <span class="kt">Response</span>
<span class="p">{</span>
    <span class="nv">$this</span><span class="o">-&gt;</span><span class="n">useCase</span><span class="o">-&gt;</span><span class="nf">execute</span><span class="p">(</span>
        <span class="n">actor</span><span class="o">:</span> <span class="nc">HttpActor</span><span class="o">::</span><span class="nf">fromRequest</span><span class="p">(</span><span class="nv">$request</span><span class="p">),</span>
        <span class="n">orderId</span><span class="o">:</span> <span class="nv">$orderId</span><span class="p">,</span>
        <span class="n">amountCents</span><span class="o">:</span> <span class="nv">$request</span><span class="o">-&gt;</span><span class="nf">integer</span><span class="p">(</span><span class="s1>'amount_cents'</span><span class="p">),</span>
    <span class="p">);</span>

    <span class="k">return</span> <span class="nf">response</span><span class="p">()</span><span class="o">-&gt;</span><span class="nf">noContent</span><span class="p">();</span>
<span class="p">}</span>

}

Enter fullscreen mode
<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title>
<path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"/>

Beş satır: girdi ayrıştırma, bir aktör oluşturma, kullanım durumuna çağrı yapma. Hiçbir authorize() yok çünkü kullanım durumu onu sahibidir.

CLI komutu artık kapalı bir şekilde başarısızdır

final class RefundOrderCommand extends Command
{
    protected $signature = ;
<span class="k">public</span> <span class="k">function</span> <span class="n">__construct</span><span class="p">(</span><span class="k">private</span> <span class="kt">RefundOrder</span> <span class="nv">$useCase</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">parent</span><span class="o">::</span><span class="nf">__construct</span><span class="p">();</span>
<span class="p">}</span>

<span class="k">public</span> <span class="k">function</span> <span class="n">handle</span><span class="p">():</span> <span class="kt">int</span>
<span class="p">{</span>
    <span class="nv">$operatorId</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="nf">option</span><span class="p">(</span><span class="s1>'operator'</span><span class="p">)</span>
        <span class="o">??</span> <span class="k">throw</span> <span class="k">new</span> <span class="nc">\RuntimeException</span><span class="p">(</span><span class="s1>'--operator is required'</span><span class="p">);</span>

    <span class="nv">$actor</span> <span class="o">=</span> <span class="nc">CliActor</span><span class="o">::</span><span class="nf">fromOperatorId</span><span class="p">(</span><span class="nv">$operatorId</span><span class="p">);</span>

    <span class="nv">$this</span><span class="o">-&gt;</span><span class="n">useCase</span><span class="o">-&gt;</span><span class="nf">execute</span><span class="p">(</span>
        <span class="n">actor</span><span class="o">:</span><span class="nv">$actor</span><span class="p">,</span>
        <span class="n">orderId</span><span class="o">:</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="nf">argument</span><span class="p">(</span><span class="s1>'order_id'</span><span class="p">),</span>
        <span class="n">amountCents</span><span class="o">:</span> <span class="p>(</span><span class="n">int</span><span class="p">)</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="nf">argument</span><span class="p">(</span><span class="s1>'amount_cents'</span><span class="p">),</span>
    <span class="p">);</span>

    <span class="nv">$this</span><span class="o">-&gt;</span><span class="nf">info</span><span class="p">(</span><span class="s2>}"Refunded </span><span class="si}>{</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="nf">argument</span><span class="p">(</span><span class="s1>'order_id'</span><span class="p">)</span><span class="si>}</span><span class="s2>""</span><span class="p">);</span>
    <span class="k">return</span> <span class="k">self</span><span class="o">::</span><span class="no">SUCCESS</span><span class="p">;</span>
<span class="p">}</span>

}

Enter fullscreen mode
<svg xmlns="http://www.w3.org/2000/svg" width="20px" height="20px" viewbox="0 0 24 24" class="highlight-action crayons-icon highlight-action--fullscreen-off"><title>Exit fullscreen mode</title>
<path d="M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z"/>

CliActor::fromOperatorId(), operatörü kullanıcı tablosunda arar ve gerçek rolleriyle bir Actor üretir ya da bir hata fırlatır. Eğer operatör bir yönetici değilse, RefundOrder::execute() çağrıldığında NotAuthorized hatası fırlatılır, sipariş üzerine herhangi bir işlem yapılmadan. Açık, yapısal olarak kapanır.

Kuyruk işlerinin şekli aynıdır: aktörü iş yükü yüküne (kimlik + roller, tüm kullanıcı değil; küçük tutun ve yeniden hidratasyonu doğrulayın) seri hale getirin, işçi tarafında bir Actor oluşturun ve kullanım durumuna aktarın. Webhook işleyicileri, sağlayıcı imzasını doğrulayarak, ardından Actor::system('stripe-webhook') ile kullanım durumuna çağrı yapar ve port, system‘in ne yapabileceğini zorlar.

Beklemeniz Gereken İki Soru

“Bu, Laravel’in middleware’ini çoğaltmıyor mu?” Hayır. Middleware, taşımayı işler: rate limiting, CSRF, oturum durumu. “Bu kullanıcı, bu spesifik siparişi bu spesifik tutar üzerinden iade etmeye izin veriyor mu?” gibi operasyon kuralları ile ilgilidir. Middleware’i taşımak için kullanın, kullanım durumlarını işlemler için. Bunlar çatışmaz.

“Form Requests / DTO’lar yetkilendirme yaparsa ne olacak?” Laravel’in FormRequest::authorize() ve benzeri Symfony kalıpları hala sadece HTTP’ye özgüdür. CLI FormRequest çalışmaz. Kuyruk işçisi bunu çalıştırmaz. Webhook işleyicisi bunu çalıştırmaz. Bunlar HTTP katman ergonomileri değildir; yetkilendirme evleri değil. Bunları taşıma düzeyinde girdi doğrulaması için kullanın; kuralı kullanım durumunda tutun.

Sakladıklarınız ve Bıraktıklarınız

Sakladıklarınız:

  • Her uygulama için bir AuthorizationPort arayüzü, domain katmanında.
  • LaravelPolicyAuthorization veya SymfonyVoterAuthorization uyarlamaları, çerçevenin mevcut politika kodunu o porta bağlı hale getirir.
  • Her giriş noktasının nasıl inşa edebileceği bir Actor değer nesnesi.
  • Durum değiştiren her kullanım durumu $auth->authorize(...) çağrısında bulunur, IO işleminden önce.
  • Bir test, izin verilmeyen bir aktör için NotAuthorized hatasının fırlatıldığını doğrular.

Atlayacaklarınız:

  • $this->authorize(...) çağrıları kontrolör içinde.
  • #[IsGranted] niteliği, arkasındaki kullanım durumu herhangi bir HTTP dışı yoldan ulaşılabilir olduğunda, kontrolör yöntemlerinde.
  • “Dahili” çağrıların (CLI, kuyruk, webhook) güvenilir olduğu varsayımı. Dahili çağrılar, yetkilendirme gerilemelerini üretime taşır. En son yakalanırlar.

Kural, kapıyı yönettiği yerin yanında yer alır. Bu, ikinci giriş noktası geldiğinde taze kalmasını sağlar.


Eğer bu faydalıysa

Aynı yapı (domain içindeki port, kenar adaptörü, ortada kullanım durumu), ikinci bir çağrıcı gün geldiğinde işlem, gözlemlenebilirlik, hata çevirimi ve diğer desenleri ele alır. Decoupled PHP, Laravel 11 ve Symfony 7 hizmetleri için tam dizilimi yürütmekte, çerçeveye bağımlı koddan ömür boyu süren bir diziye geçiş sağlar.

Decoupled PHP — Clean and Hexagonal Architecture for Applications That Outlive the Framework

Kindle, Ciltli ve Karton kapak olarak mevcut. Şu anda İngilizce, Almanca ve Japonca baskıları var; Portekizce ve İspanyolca baskılar yakında geliyor.

Kaynak: Orijinal Makale

Kod İnceleme: Laravel Projelerinde Versiyon Kontrol Sisteminin Önemi
Üreticiler için En İyi 5 Sosyal Medya Pazarlama Türü
Merhaba Geliştirici Topluluğu! Ben Imran Ahmed – Kıdemli Full-Stack Laravel & React Geliştiricisi
Vivaldi tarayıcı nedense arabanıza geliyor
WordPress Sitesi Nasıl Kurulur?
Bu Makaleyi Paylaş
Facebook Bağlantıyı Kopyala Yazdır
Paylaş
Önceki Makale Yeni Xbox Kumandası ile Oyun Deneyiminizi Zirveye Taşıyın
Sonraki Makale Plex, Ömür Boyu Geçiş Ücretini 750 Dolar Yükseltiyor

Sanal Medya

FacebookBeğen
452Takip Et
PinterestSabitle
237Takip Et

Son Eklenenler

Aoostar mini-PC’ler: 400 $’ın altında Ryzen gücü sunuyor
Donanım
Pandaria Macerası Sona Ererken Orgrimmar Kuşatması Azeroth’ta Başlıyor
Oyun
E-bike Girişimleri Kriz Yaşarken, Lectric Büyümeye Devam Ediyor
Genel
Sonos Era 100 Hoparlör Fiyatıyla Kaçırılmayacak Bir Fırsat Sunuyor
Liste
Xbox’ın CEO’sundan Kaçırılmaması Gereken Özel İçerik Açıklaması
Oyun
Ferrynoia Bitecek: Yeşil Deniz Teknolojisiyle Yeni Dönem Başlıyor!
Genel
//

Siber güvenlik, yapay zeka ve savunma sanayiinden; finans ve sinema dünyasına uzanan geniş bir yelpaze. Teknomers; teknoloji, strateji ve yazılım dünyasını sade bir dille sizlerle buluşturuyor.

Kurumsal

  • Hakkımızda
  • Gizlilik politikası
  • Tanıtım Yazısı ve Backlink Hizmeti

Kategoriler

  • Teknoloji
  • Oyun
  • Sinema
  • Siber Güvenlik
  • Bilim
  • Finans
  • Dünyadan Güncel Haberler

Populer

  • TV'de Ücretsiz İzlenebilen Şifresiz Erotik Kanallar (2025 Güncel Frekans Listesi)

  • The Last of Us PC Kontrolleri: Hızlı Silah Değiştirme ve Tüm Tuşlar (2025)

  • Hogwarts Legacy'de Odaklanma İksiri Nasıl Yapılır?

Teknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor Haberleri
Bizi Takip Et
© 2026 Teknomers. All Rights Reserved.
Welcome Back!

Sign in to your account

Kullanıcı Adı veya E-posta Adresi
Şifre

Şifrenizi mi unuttunuz?