Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
DDDにおける認可の扱いとKotlinにおける実装パターン / authorization-f...
Search
urmot
July 18, 2024
Technology
4
1k
DDDにおける認可の扱いとKotlinにおける実装パターン / authorization-for-ddd-and-kotlin-implement-pattern
urmot
July 18, 2024
Tweet
Share
More Decks by urmot
See All by urmot
ログラスを支える設計標準について / loglass-design-standards
urmot
12
2.8k
ログラスを支える技術的投資の仕組み / loglass-technical-investment
urmot
10
5.9k
実践!CloudFormation Best Practice ~CloudFormationで始める組織改革~
urmot
2
3.3k
CircleCIを導入した話
urmot
0
79
SPA on AWS
urmot
0
200
実践!CloudFormation Best Practice
urmot
0
210
RDBのログを取る時にDMSを使うという選択肢
urmot
0
130
ベンチャー企業のインフラを運用して学んだ99のこと
urmot
0
1.2k
Other Decks in Technology
See All in Technology
Tech-Verse 2025 Keynote
lycorptech_jp
PRO
0
1.3k
Snowflake Summit 2025全体振り返り / Snowflake Summit 2025 Overall Review
mtpooh
2
440
Core Audio tapを使ったリアルタイム音声処理のお話
yuta0306
0
150
Amazon Bedrockで実現する 新たな学習体験
kzkmaeda
2
680
FOSS4G 2025 KANSAI QGISで点群データをいろいろしてみた
kou_kita
0
180
低レイヤを知りたいPHPerのためのCコンパイラ作成入門 完全版 / Building a C Compiler for PHPers Who Want to Dive into Low-Level Programming - Expanded
tomzoh
4
3.4k
250627 関西Ruby会議08 前夜祭 RejectKaigi「DJ on Ruby Ver.0.1」
msykd
PRO
2
370
5min GuardDuty Extended Threat Detection EKS
takakuni
0
180
マーケットプレイス版Oracle WebCenter Content For OCI
oracle4engineer
PRO
3
940
開発生産性を組織全体の「生産性」へ! 部門間連携の壁を越える実践的ステップ
sudo5in5k
0
340
KubeCon + CloudNativeCon Japan 2025 に行ってきた! & containerd の新機能紹介
honahuku
0
120
本が全く読めなかった過去の自分へ
genshun9
0
710
Featured
See All Featured
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
233
17k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Rebuilding a faster, lazier Slack
samanthasiow
82
9.1k
A better future with KSS
kneath
239
17k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
5
230
How to train your dragon (web standard)
notwaldorf
94
6.1k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.3k
A designer walks into a library…
pauljervisheath
207
24k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
657
60k
The Cult of Friendly URLs
andyhume
79
6.5k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
Transcript
1 ©2024 Loglass Inc. DDDにおける認可の扱いと Kotlinでの実装パターン 2024.7.18 Server-side Kotlin Night
Yuta Muramoto / Loglass, Inc.
2 2 ©2024 Loglass Inc. 株式会社ログラス 開発部 エンジニア 村本 雄太
/ Yuta Muramoto (@urmot2) 自己紹介 株式会社ログラスでLoglass⼈員計画という新規プロダクトの開発をし ています。 普段はKotlin + SpringBootで開発しており、Kotlin Festでは「認可 x DDD」という内容でプロポーザルを出したが、お⾒送りになったの で、今回リベンジさせてもらいます。
3
4 ©2024 Loglass Inc. 認可について
5 ©2024 Loglass Inc. 5 認可について 認可は操作を実行する許可を出すため仕組み 例: ブログ投稿サービス
• 権限(Permission): 投稿者はポストを編集できる。 • 認可(Authorization): ユーザーがポストを編集する権限があれば許可し、なければ拒否する。
6 ©2024 Loglass Inc. 6 認可について よくあるパターン
7 ©2024 Loglass Inc. 7 認可について 認可処理はどのように書くべき? • よくあるパターンで書く?
• ライブラリを利用する? • DDDを採用している場合は? • マイクロサービスではどうあるべき?
8 ©2024 Loglass Inc. 8 認可について 認可処理はどのように書くべき? • よくあるパターンで書く?
• ライブラリを利用する? • DDDを採用している場合は? • マイクロサービスではどうあるべき?
9 ©2024 Loglass Inc. DDDにおける認可について
10 ©2024 Loglass Inc. DDDにおける認可について 実践ドメイン駆動設計が認可についてしっかり書かれていた
11 11 ©2024 Loglass Inc. しかし彼らはモデルには明確な制限があって、それ以上に広げ すぎては行けないということを理解していなかった。その結果、 セキュリティや権限の情報をコラボレーションモデルに組み込 んでしまうという、間違いを犯してしまった。 (中略)
つまりそれは、二つのモデルをひとつに混ぜ込んでしまうという ことだ。程なく彼らも気がついた。この混乱する状況は、セキュリ ティについての関心事をコアドメインに混ぜ込んだことに起因す るものである。まさに コアビジネスロジックのど真ん中で、開発 者がクライアントの権限をチェックしてからリクエストを処理し ていたのだ。 by 実践ドメイン駆動設計 第2章「ドメイン、サブドメイン、境界づ けられたコンテキスト」 DDDにおける認可について
12 12 ©2024 Loglass Inc. DDDにおける認可について
13 13 ©2024 Loglass Inc. DDDにおける認可について
14 ©2024 Loglass Inc. 14 DDDにおける認可について 最終的に認可に関する関心事をコアドメインから分離している
15 ©2024 Loglass Inc. 認可のベストプラクティスでは?
16 ©2024 Loglass Inc. 認可のベストプラクティスでは?
17 17 ©2024 Loglass Inc. 認可のベストプラクティスでは? 承認はすべてのアプリケーションにとって重要な要素ですが、ユーザー にはほとんど見えません。 また、通常はコア機能やビジネスロジックとは無関係です
。 https://www.osohq.com/academy/what-is-authorization
18 18 ©2024 Loglass Inc. 認可のベストプラクティスでは? 承認はすべてのアプリケーションにとって重要な要素ですが、ユーザー にはほとんど見えません。 また、通常はコア機能やビジネスロジックとは無関係です
。 https://www.osohq.com/academy/what-is-authorization 上記にはさまざまな順列や組み合わせがありますが、ほとんどのアプ リケーションでは通常、次の設定をお勧めします。 1. 認証を処理するには、ID プロバイダーを使用します。 2. アプリケーション自体で認証を強制します。 3. 承認インターフェースを追加して、 承認ロジックをアプリケーショ ンコードから分離します。 https://www.osohq.com/academy/what-is-authorization
19 ©2024 Loglass Inc. Kotlinで認可ロジックを分離する方法
20 ©2024 Loglass Inc. 20 認可について 認可処理はどのように書くべき? • よくあるパターンで書く?
• ライブラリを利用する? • DDDを採用している場合は? • マイクロサービスではどうあるべき?
21 21 ©2024 Loglass Inc. Kotlinで認可ロジックを分離する方法 例: ブログ管理サービス ブログ管理サービスの認可ロジックは以下の通りです。
• チーム内にブログを投稿できるのはチームメンバーのみ • プライベートな記事はチームのメンバーだけが閲覧可能
22 22 ©2024 Loglass Inc. Kotlinで認可ロジックを分離する方法 1. 共通interfaceを使うパターン
23 23 ©2024 Loglass Inc. Kotlinで認可ロジックを分離する方法 共通interfaceを使うパターン
24 24 ©2024 Loglass Inc. Kotlinで認可ロジックを分離する方法 1. 共通interfaceの実装
25 25 ©2024 Loglass Inc. Kotlinで認可ロジックを分離する方法 1. 共通interfaceを使うUseCase
26 26 ©2024 Loglass Inc. Kotlinで認可ロジックを分離する方法 利点: ドメインロジックに認可ロジックが入りこまない (分離できる )
27 ©2024 Loglass Inc. Kotlinで認可ロジックを分離する方法 欠点: 認可処理を強制できない
28 ©2024 Loglass Inc. 28 Kotlinで認可ロジックを分離する方法 2. Authorizedモナドを利用するパターン
29 ©2024 Loglass Inc. 29 Kotlinで認可ロジックを分離する方法 Authorized<T> は Authorizer 経由でしか作成できない
30 ©2024 Loglass Inc. 30 Kotlinで認可ロジックを分離する方法 認可処理の実装は各コンテキストの packageに配置
31 ©2024 Loglass Inc. 31 Kotlinで認可ロジックを分離する方法 Repositoryの引数を Allowed<T> にする
32 ©2024 Loglass Inc. 32 Kotlinで認可ロジックを分離する方法 利点: 認可処理を実行しないと saveメソッドが呼び出せない!
33 ©2024 Loglass Inc. まとめ
34 34 ©2024 Loglass Inc. まとめ 認可ロジックはコアドメインから分離する! • IDDD本でも、Oso Authorization
Academyでも認可ロジックの分離を推奨しています • 認可ロジックを分離する方法として以下を紹介しました a. 共通interfaceパターン b. Authorizedモナド • 認可ロジックは取得系のほうが考えることが多く難しいです • Spring Securityなどのライブラリを利用することでうまく分離可能な場合もあります • ユースケースやプロダクトの状況に合わせて最適な実装方法を選択する必要は依然としてある
35