Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥

桃太郎で始めるRego入門‐今日から使えるRegoの基本編

Avatar for bmf_san bmf_san
December 19, 2025

 桃太郎で始めるRego入門‐今日から使えるRegoの基本編

Avatar for bmf_san

bmf_san

December 19, 2025
Tweet

More Decks by bmf_san

Other Decks in Programming

Transcript

  1. © SmartHR, Inc. 桃太郎で始めるRego⼊⾨ 今⽇から使えるRegoの基本編 ⽵内 健太 / X @bmf_san

    SmartHR プロダクト基盤開発本部 権限基盤ユニット アーキテクチャチーム 2025/12/19 第14回 SmartHR LT大会
  2. 基本構⽂ # Input {"user": "admin"} # Policy allow if {

    input.user == "admin" } 5 # Output {"allow": true}
  3. 7

  4. 8

  5. 9

  6. おばあさんの脳内 { "peach": { "size": "large", "from": "upstream", "content": "boy"

    } } allow if { input.peach.size == "large" input.peach.from == "upstream" input.peach.content == "boy" } allow if { input.peach.has_special_mark == true } allow if { input.peach.size == "large" not input.peach.is_rotten } allow if { not input.peach.is_poisonous } {"allow": true} 10
  7. おばあさんの脳内 # ルール内はAND:全ての条件を満たす必要がある allow if { input.peach.size == "large" #

    大きい桃か? input.peach.from == "upstream" # 川上から来たか? input.peach.content == "boy" # 中身は男の子か? } 11
  8. おばあさんの脳内 # NOT: 否定を使った条件 allow if { input.peach.size == "large"

    not input.peach.is_rotten # 腐っていないことを確認 } 13
  9. おばあさんの脳内 allow if { input.peach.size == "large" input.peach.from == "upstream"

    input.peach.content == "boy" } allow if { input.peach.has_special_mark == true } allow if { input.peach.size == "large" not input.peach.is_rotten } allow if { not input.peach.is_poisonous } 15 • (⼤きい かつ 川上から来た か つ 中⾝が男の⼦) • または (特別な印がある) • または (⼤きい かつ 腐ってい ない) • または (毒がない)
  10. おばあさんの脳内 allow if { input.peach.size == "large" input.peach.from == "upstream"

    input.peach.content == "boy" } allow if { input.peach.has_special_mark == true } allow if { input.peach.size == "large" not input.peach.is_rotten } allow if { not input.peach.is_poisonous } 16 • (⼤きい かつ 川上から来た かつ 中⾝が男の⼦) または (特別な印がある) または (⼤ きい かつ 腐っていない) ま たは (毒がない) 毒がなければTrue!
  11. 17

  12. 18

  13. 桃太郎の脳内 { "name": "dog", "traits": ["obedient", "serious", "good_natured"] } default

    allow := false good_traits := [trait | trait := input.traits[_] trait in {"obedient", "serious", "good_natured"} ] allow if { count(good_traits) == 3 } 19 {"allow": true}
  14. 桃太郎の脳内 23 • 従順で • 真⾯⽬で • いいやつ • だったら採⽤!

    default allow := false good_traits := [trait | trait := input.traits[_] trait in {"obedient", "serious", "good_natured"} ] allow if { count(good_traits) == 3 }
  15. 24

  16. 25

  17. 桃太郎の脳内 { "user": {"origin": "peach"}, "targets": [{"type": "oni"}], "companions": ["dog"],

    "fed_companions": [] } has_oni_target if { some target in input.targets target.type == "oni" } all_companions_fed if { count(input.companions) > 0 every companion in input.companions { companion in input.fed_companions } } allow if { input.user.origin == "peach" has_oni_target all_companions_fed } 26 {"allow": false}
  18. 30

  19. 桃太郎の脳内 { "user": {"origin": "peach"}, "targets": [{"type": "oni"}], "companions": ["dog"],

    "fed_companions": ["dog"] } 31 {"allow": true} ⾷べさせる!
  20. 32

  21. まとめ • ANDやOR、NOTなどの演算 • defaultキーワード • 配列内包 [x | x

    := list[_]; 条件] • someやeveryの量化 • データとロジックは分離 33