Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
9170451
Implemented RBAC middleware support with example
goginenibhavani2000 Jul 17, 2025
a123a03
Add route specific override and fix userRole read from context
goginenibhavani2000 Aug 10, 2025
e59fd18
remove unneccessary changes
goginenibhavani2000 Aug 10, 2025
993dd2e
Merge branch 'development' into RBAC-middleware-support
goginenibhavani2000 Aug 10, 2025
23073f7
Added unit tests to rbac package
goginenibhavani2000 Aug 11, 2025
0a0334f
fix linters
goginenibhavani2000 Aug 11, 2025
2cb75bf
Merge branch 'development' into RBAC-middleware-support
goginenibhavani2000 Aug 13, 2025
21b6309
add go.od to separate out RBAC module
goginenibhavani2000 Aug 13, 2025
c57a2e1
Merge branch 'development' into RBAC-middleware-support
Umang01-hash Aug 20, 2025
0f9226d
Merge branch 'development' into RBAC-middleware-support
Sep 1, 2025
03b7ab9
defining roles at route level and using assert.equal in test files
Sep 2, 2025
4c42ab9
Merge branch 'development' into RBAC-middleware-support
Umang01-hash Oct 6, 2025
ed3917f
extending capabilities to other RBACs also
coolwednesday Nov 20, 2025
ab56bcb
extending the capabilities to db and jwt
coolwednesday Nov 20, 2025
6412e61
Merge branch 'development' into RBAC-middleware-support
coolwednesday Nov 20, 2025
4412798
refactored docs and corrected tests
coolwednesday Nov 21, 2025
648022e
removed unrelated changes
coolwednesday Nov 21, 2025
fa4950c
Merge branch 'development' into RBAC-middleware-support
coolwednesday Nov 21, 2025
7949f53
fixed linters
coolwednesday Nov 23, 2025
b5c5f90
Merge branch 'development' into RBAC-middleware-support
coolwednesday Nov 23, 2025
b1d82ae
fixed linters
coolwednesday Nov 23, 2025
b222b3d
Merge branch 'development' into RBAC-middleware-support
coolwednesday Nov 24, 2025
c34436e
refactored tests to suit CI env
coolwednesday Nov 24, 2025
68b1a9b
Merge branch 'development' into RBAC-middleware-support
coolwednesday Nov 26, 2025
f111d32
refactored according to review comments
coolwednesday Nov 27, 2025
a7d40d2
fixed go mod
coolwednesday Nov 27, 2025
ca5cbd6
resolved merge conflicts
coolwednesday Nov 27, 2025
6827154
fixed go.mod changes
coolwednesday Nov 27, 2025
1445919
fixing commit versions
coolwednesday Nov 27, 2025
0348ca4
Merge branch 'development' into RBAC-middleware-support
coolwednesday Nov 27, 2025
913ecce
adding modules in go work
coolwednesday Nov 27, 2025
9241c6d
Merge remote-tracking branch 'bhavani/RBAC-middleware-support' into R…
coolwednesday Nov 27, 2025
197b230
fixed workspace inconsistencies
coolwednesday Nov 27, 2025
a1c84f6
final fix hopefully
coolwednesday Nov 27, 2025
b33cfff
fix go.mod
coolwednesday Nov 27, 2025
8dcc67b
resolved review comments
coolwednesday Nov 27, 2025
1ecb0a4
resolving review comments and fixing linters
coolwednesday Nov 27, 2025
3cc76b1
refactoring code based on review comments
coolwednesday Nov 30, 2025
522dd63
to be reverted
coolwednesday Dec 3, 2025
826ac6c
refactored rbacc implementation
coolwednesday Dec 3, 2025
f5758bc
added tests and updated documentation
coolwednesday Dec 4, 2025
69a5c62
reverted unecessary changes
coolwednesday Dec 4, 2025
0083112
refactored based on review comments
coolwednesday Dec 5, 2025
87986fe
resolved merge conflicts
coolwednesday Dec 5, 2025
9685cbd
fixed tests
coolwednesday Dec 5, 2025
e3638b0
added tests and linters
coolwednesday Dec 5, 2025
f0e4f67
resolve merge conflicts
coolwednesday Dec 5, 2025
500ef2a
removed unecessary changes
coolwednesday Dec 5, 2025
f17c958
using logger and metrics interface
coolwednesday Dec 8, 2025
a1c481e
removing unused hierarchy.go and fixing tests
coolwednesday Dec 8, 2025
163b173
consolidating all logic in middleware.go and fixing tests
coolwednesday Dec 8, 2025
0d3fc41
fixed regex logic to support early return
coolwednesday Dec 8, 2025
fd259bb
Merge branch 'development' into RBAC-middleware-support
coolwednesday Dec 8, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
565 changes: 565 additions & 0 deletions docs/advanced-guide/rbac/page.md

Large diffs are not rendered by default.

5 changes: 5 additions & 0 deletions docs/navigation.js
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,11 @@ export const navigation = [
href: '/docs/advanced-guide/http-authentication',
desc: "Implement various HTTP authentication methods to secure your GoFR application and protect sensitive endpoints."
},
{
title: 'Role-Based Access Control (RBAC)',
href: '/docs/advanced-guide/rbac',
desc: "Implement comprehensive Role-Based Access Control with support for roles, permissions, hierarchy, JWT integration, hot reloading, and fine-grained permission-based authorization."
},
{
title: 'Circuit Breaker Support',
href: '/docs/advanced-guide/circuit-breaker',
Expand Down
3 changes: 2 additions & 1 deletion go.work
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ use (
./pkg/gofr/datasource/elasticsearch
./pkg/gofr/datasource/file/azure
./pkg/gofr/datasource/file/ftp
./pkg/gofr/datasource/file/s3
./pkg/gofr/datasource/file/gcs
./pkg/gofr/datasource/file/s3
./pkg/gofr/datasource/file/sftp
./pkg/gofr/datasource/influxdb
./pkg/gofr/datasource/kv-store/badger
Expand All @@ -27,4 +27,5 @@ use (
./pkg/gofr/datasource/scylladb
./pkg/gofr/datasource/solr
./pkg/gofr/datasource/surrealdb
./pkg/gofr/rbac
)
3 changes: 1 addition & 2 deletions go.work.sum
Original file line number Diff line number Diff line change
Expand Up @@ -345,6 +345,7 @@ github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo
github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=
github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI=
github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk=
Expand Down Expand Up @@ -736,8 +737,6 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ=
golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546 h1:mgKeJMpvi0yx/sU5GsxQ7p6s2wtOnGAHZWCHUM4KGzY=
golang.org/x/exp v0.0.0-20251023183803-a4bb9ffd2546/go.mod h1:j/pmGrbnkbPtQfxEe5D0VQhZC6qKbfKifgD0oM7sR70=
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/image v0.25.0 h1:Y6uW6rH1y5y/LK1J8BPWZtr6yZ7hrsy6hFrXjgsc2fQ=
Expand Down
80 changes: 80 additions & 0 deletions pkg/gofr/rbac.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package gofr

import (
"net/http"

"go.opentelemetry.io/otel"
)

// RBACProvider is the interface for RBAC implementations.
// External RBAC modules (like gofr.dev/pkg/gofr/rbac) implement this interface.
type RBACProvider interface {
// UseLogger sets the logger for the provider
UseLogger(logger any)

// UseMetrics sets the metrics for the provider
UseMetrics(metrics any)

// UseTracer sets the tracer for the provider
UseTracer(tracer any)

// LoadPermissions loads RBAC configuration from the stored config path
LoadPermissions() error

// ApplyMiddleware returns the middleware function using the stored config
// The returned function should be compatible with http.Handler middleware pattern
ApplyMiddleware() func(http.Handler) http.Handler
}

// DefaultRBACConfig is a constant that can be passed to NewProvider to use default config paths.
// When passed, NewProvider will try: configs/rbac.json, configs/rbac.yaml, configs/rbac.yml.
const DefaultRBACConfig = ""

// EnableRBAC enables RBAC by loading configuration from a JSON or YAML file.
// This is a factory function that registers RBAC implementations and sets up the middleware.
// The config file path is stored in the provider (set via NewProvider).
//
// Pure config-based: All authorization rules are defined in the config file using:
// - Roles: role → permission mapping (format: "resource:action")
// - Endpoints: route & method → permission mapping
//
// Example:
//
// import (
// "gofr.dev/pkg/gofr"
// "gofr.dev/pkg/gofr/rbac"
// )
//
// app := gofr.New()
// provider := rbac.NewProvider("configs/rbac.json") // Store config path
// app.EnableRBAC(provider) // Uses stored path
//
// Role extraction is configured in the config file:
// - Set "roleHeader" for header-based extraction (e.g., "X-User-Role")
// - Set "jwtClaimPath" for JWT-based extraction (e.g., "role", "roles[0]").
func (a *App) EnableRBAC(provider RBACProvider) {
if provider == nil {
a.Logger().Error("RBAC provider is required. Create one using: provider := rbac.NewProvider(\"configs/rbac.json\")")
return
}

// Set logger, metrics, and tracer automatically
provider.UseLogger(a.Logger())
provider.UseMetrics(a.Metrics())

tracer := otel.GetTracerProvider().Tracer("gofr-rbac")
provider.UseTracer(tracer)

// Load configuration from file using the provider
// Logger is automatically set on config during LoadPermissions
if err := provider.LoadPermissions(); err != nil {
a.Logger().Errorf("Failed to load RBAC config: %v", err)
return
}

a.Logger().Infof("Loaded RBAC config successfully")

// Apply middleware using the provider
middlewareFunc := provider.ApplyMiddleware()
a.httpServer.router.Use(middlewareFunc)
}
Loading