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
Kotlinで学ぶ 代数的データ型
ysknsid25
5
1.1k
(非公式) AWS Summit Japan と 海浜幕張 の歩き方 2025年版
coosuke
PRO
0
150
“プロダクトを好きになれるか“も QAエンジニア転職の大事な判断基準だと思ったの
tomodakengo
0
120
Tenstorrent HW/SW 概要説明
tenstorrent_japan
0
390
宇宙パトロール ルル子から考える LT設計のコツ
masakiokuda
2
100
今からでも間に合う! 生成AI「RAG」再入門 / Re-introduction to RAG in Generative AI
hideakiaoyagi
1
160
kubellが挑むBPaaSにおける、人とAIエージェントによるサービス開発の最前線と技術展望
kubell_hr
0
270
Copilot Agentを普段使いしてわかった、バックエンド開発で使えるTips
ykagano
0
290
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
7.2k
20250612_GitHubを使いこなすためにソニーの開発現場が取り組んでいるプラクティス.pdf
osakiy8
1
730
本部長の代わりに提案書レビュー! KDDI営業が毎日使うAIエージェント「A-BOSS」開発秘話
minorun365
PRO
13
1.6k
Workflows から Agents へ ~ 生成 AI アプリの成長過程とアプローチ~
belongadmin
2
140
Featured
See All Featured
Building Flexible Design Systems
yeseniaperezcruz
328
39k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
Measuring & Analyzing Core Web Vitals
bluesmoon
7
480
We Have a Design System, Now What?
morganepeng
52
7.6k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.2k
Embracing the Ebb and Flow
colly
86
4.7k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
10
900
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
228
22k
How GitHub (no longer) Works
holman
314
140k
A Tale of Four Properties
chriscoyier
159
23k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
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