Slide 1

Slide 1 text

    から考えるLaravelの middleware、      に書くか?     に書くか? PHPカンファレンス福岡2024 凝集性 routing Policy @NobleNomad

Slide 2

Slide 2 text

1. 自己紹介

Slide 3

Slide 3 text

自己紹介

Slide 4

Slide 4 text

結論 Entityごとに対する操作で認可行う → Enittyの凝集性が高まる

Slide 5

Slide 5 text

その前に... LARAVELの認証 について

Slide 6

Slide 6 text

認可?  POLICY? 🧐

Slide 7

Slide 7 text

前提知識 ユーザーが を実行する権限を持っている かどうかを判断 認可とは? 01 に対する認可を管理 Policyとは? 02 特定のアクション 特定のモデル

Slide 8

Slide 8 text

Policyの紹介 Policyは         に対する認可を管理できる 特定のモデル

Slide 9

Slide 9 text

Policyの紹介 Policyは         に対する認可を管理できる 特定のモデル

Slide 10

Slide 10 text

Policyの紹介 Policyは         に対する認可を管理できる 特定のモデル (リクエスト元の)ユーザ自分自身のみがユーザを閲覧できる

Slide 11

Slide 11 text

2. Laravel認可の   基本

Slide 12

Slide 12 text

2. Laravel認可の基本 Gateファサード経由 の認可 routingに書く Middleware の認可

Slide 13

Slide 13 text

2. Laravel認可の基本 Gateファサード経由 の認可 routingに書く Middleware の認可

Slide 14

Slide 14 text

routingに書く Middlewareの認可 Laravelでは特定のユーザだけがアクセスできるように設定を Routingに直接記載できる

Slide 15

Slide 15 text

Laravelでは特定のユーザだけがアクセスできるように設定を Routingに直接記載できる routingに書く Middlewareの認可

Slide 16

Slide 16 text

Laravelでは特定のユーザだけがアクセスできるように設定を Routingに直接記載できる 認証済みの人のみアクセスできる routingに書く Middlewareの認可

Slide 17

Slide 17 text

2. Laravel認可の基本 Gateファサード経由 の認可 routingに書く Middleware の認可

Slide 18

Slide 18 text

Gateファサード経由 の認可 簡単に      の認可ロジックを定義できます。 カスタム

Slide 19

Slide 19 text

Gateファサード経由 の認可 簡単に      の認可ロジックを定義できます。 カスタム

Slide 20

Slide 20 text

3. それぞれの メリット・デメリット

Slide 21

Slide 21 text

3. それぞれのメリット・デメリット Gateファサード経由 の場合 routing記載 の場合

Slide 22

Slide 22 text

3. それぞれのメリット・デメリット Gateファサード経由 の場合 routing記載 の場合

Slide 23

Slide 23 text

routingファイルに認可を書く 場合の問題点 routingファイルが複雑化 認可ロジックも含んでしまう デメリット routingに全部かいてある メリット

Slide 24

Slide 24 text

3. それぞれのメリット・デメリット Gateファサード経由 の場合 routing記載 の場合

Slide 25

Slide 25 text

routingファイルに認可を書く 場合の問題点 定義した数だけ増える 管理が命名方法に依存 デメリット 認可ロジックがGate定義 に集中 メリット

Slide 26

Slide 26 text

じゃあ認可の責務がど こにあるべきか?

Slide 27

Slide 27 text

凝集性を 高めるためには?

Slide 28

Slide 28 text

認可ロジックは操作の近 くにあるといいかも

Slide 29

Slide 29 text

前提知識 ユーザーが を実行する権限を持っている かどうかを判断 認可とは? 01 に対する認可を管理 Policyとは? 02 特定のアクション 特定のモデル

Slide 30

Slide 30 text

4.            を 使った認可の設計 ValueObject・Entity

Slide 31

Slide 31 text

対象プロダクトについて レイヤードアーキテクチャ + DDD(一部アレンジ)

Slide 32

Slide 32 text

対象プロダクトについて レイヤードアーキテクチャ + DDD(一部アレンジ) ValueObject・Entityが ドメインを表している (Service層・DomainService層が存在しない)

Slide 33

Slide 33 text

ドメインに対する操作 = ValueObject・Entityに対するそう

Slide 34

Slide 34 text

ここで認可のおさらい

Slide 35

Slide 35 text

前提知識 に対する認可を管理 Policyとは? 02 特定のアクション ユーザーが を実行する権限を持っている かどうかを判断 認可とは? 01 特定のモデル

Slide 36

Slide 36 text

Entityごとに対する操作で 認可行う → Entityの凝集性が高まるのでは?

Slide 37

Slide 37 text

いつ認可を行うか

Slide 38

Slide 38 text

対象プロダクトについて .2 ルーティングパラメータからEntityをbindしている GET: /{user}/profile UserEntityを取得し、ControllerへDI

Slide 39

Slide 39 text

対象プロダクトについて .2 ルーティングパラメータからEntityをbindしている GET: /{user}/profile UserEntityを取得し、ControllerへDI このタイミングで認可

Slide 40

Slide 40 text

5. まとめ

Slide 41

Slide 41 text

まとめ Entityごとに対する操作で認可行う Enittyの凝集性が高まる いつ認可を行うか bindingするタイミング?