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
1.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.9k
ログラスを支える技術的投資の仕組み / loglass-technical-investment
urmot
10
6k
実践!CloudFormation Best Practice ~CloudFormationで始める組織改革~
urmot
2
3.4k
CircleCIを導入した話
urmot
0
87
SPA on AWS
urmot
0
210
実践!CloudFormation Best Practice
urmot
0
230
RDBのログを取る時にDMSを使うという選択肢
urmot
0
140
ベンチャー企業のインフラを運用して学んだ99のこと
urmot
0
1.3k
Other Decks in Technology
See All in Technology
dbtとAIエージェントを組み合わせて見えたデータ調査の新しい形
10xinc
6
1.2k
QA業務を変える(!?)AIを併用した不具合分析の実践
ma2ri
0
160
Open Table Format (OTF) が必要になった背景とその機能 (2025.10.28)
simosako
2
360
プロファイルとAIエージェントによる効率的なデバッグ / Effective debugging with profiler and AI assistant
ymotongpoo
1
330
プロダクト開発と社内データ活用での、BI×AIの現在地 / Data_Findy
sansan_randd
1
510
Behind Postgres 18: The People, the Code, & the Invisible Work | Claire Giordano | PGConfEU 2025
clairegiordano
0
140
もう外には出ない。より快適なフルリモート環境を目指して
mottyzzz
13
11k
可観測性は開発環境から、開発環境にもオブザーバビリティ導入のススメ
layerx
PRO
4
1.4k
AI機能プロジェクト炎上の 3つのしくじりと学び
nakawai
0
120
SOTA競争から人間を超える画像認識へ
shinya7y
0
590
Oracle Database@Google Cloud:サービス概要のご紹介
oracle4engineer
PRO
0
370
クラウドとリアルの融合により、製造業はどう変わるのか?〜クラスメソッドの製造業への取組と共に〜
hamadakoji
0
450
Featured
See All Featured
Optimising Largest Contentful Paint
csswizardry
37
3.5k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.5k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
10
620
How to Think Like a Performance Engineer
csswizardry
27
2.1k
Principles of Awesome APIs and How to Build Them.
keavy
127
17k
The Art of Programming - Codeland 2020
erikaheidi
56
14k
A Tale of Four Properties
chriscoyier
161
23k
Building Adaptive Systems
keathley
44
2.8k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
3.7k
Writing Fast Ruby
sferik
630
62k
How GitHub (no longer) Works
holman
315
140k
How STYLIGHT went responsive
nonsquared
100
5.9k
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