Skip to content

tonbiattack/sample-rbac

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

sample-rbac

MySQL + Go + GORM + Docker で作る、最小のRBACサンプルです。

この記事 docs/なぜ壊れた権限設計が生まれるのか(RBAC設計の実務).md のテーブル設計をそのまま採用しています。

テーブル設計(記事と同一)

  • users
  • roles
  • permissions
  • user_roles
  • role_permissions

DDL は db/init/001_schema.sql を参照してください。

セットアップ

docker compose up -d mysql

MySQL接続情報(デフォルト):

  • host: 127.0.0.1
  • port: 3306
  • database: sample_rbac
  • user: app
  • password: app

実際の処理でのユースケース

このサンプルでは、業務処理の入口で権限を確認します。

db, _ := rbac.OpenMySQL("app:app@tcp(127.0.0.1:3306)/sample_rbac?parseTime=true")
repo := rbac.NewRepository(db)
authorizer := usecase.NewAuthorizer(repo)
exporter := usecase.NewReportExporter(authorizer)

fileName, err := exporter.ExportMonthlyReport(ctx, userID)
if errors.Is(err, usecase.ErrForbidden) {
    // 403 相当の扱い
}

処理の流れ:

  1. ReportExporter.ExportMonthlyReport が呼ばれる
  2. Authorizer.Requirereport.export をチェックする
  3. 内部で Repository.HasPermission が DB から権限を判定する
  4. 権限があれば業務処理を続行、なければ ErrForbidden

テストファーストで作った内容

先に失敗テストを作成し、後から実装しています。

対象テスト:

  • Repository の統合テスト
    • HasPermission: ユーザーが特定権限を持つか
    • HasPermission_FalseWhenNotGranted: 権限未付与時の判定
    • ListPermissions_DistinctSorted: 権限一覧の重複排除とソート
  • Usecase の統合テスト
    • ExportMonthlyReport_Success: 権限ありで成功
    • ExportMonthlyReport_Forbidden: 権限なしで拒否

実行:

go test ./...

実装ファイル

片付け

docker compose down

データも削除する場合:

docker compose down -v

About

権限管理RBAC サンプル

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages