mirror of
https://github.com/SigNoz/signoz.git
synced 2026-02-03 08:33:26 +00:00
* feat(authz): initial commit for migrating rbac to openfga * feat(authz): make the role updates idempotant * feat(authz): split role module into role and grant * feat(authz): some naming changes * feat(authz): integrate the grant module * feat(authz): add support for migrating existing user role * feat(authz): add support for migrating existing user role * feat(authz): figure out the * selector * feat(authz): merge main * feat(authz): merge main * feat(authz): address couple of todos * feat(authz): address couple of todos * feat(authz): fix tests and revert public dashboard change * feat(authz): fix tests and revert public dashboard change * feat(authz): add open api spec * feat(authz): add open api spec * feat(authz): add api key changes and missing migration * feat(authz): split role into getter and setter * feat(authz): add integration tests for authz register * feat(authz): add more tests for user invite and delete * feat(authz): update user tests * feat(authz): rename grant to granter * feat(authz): address review comments * feat(authz): address review comments * feat(authz): address review comments * feat(authz): add the migration for existing roles * feat(authz): go mod tidy * feat(authz): fix integration tests * feat(authz): handle community changes * feat(authz): handle community changes * feat(authz): role selectors for open claims * feat(authz): role selectors for open claims * feat(authz): prevent duplicate entries for changelog * feat(authz): scafolding for rbac migration * feat(authz): scafolding for rbac migration * feat(authz): scafolding for rbac migration * feat(authz): scafolding for rbac migration * feat(authz): scafolding for rbac migration
109 lines
2.5 KiB
Go
109 lines
2.5 KiB
Go
package implrole
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/SigNoz/signoz/pkg/authz"
|
|
"github.com/SigNoz/signoz/pkg/modules/role"
|
|
"github.com/SigNoz/signoz/pkg/types/authtypes"
|
|
"github.com/SigNoz/signoz/pkg/types/roletypes"
|
|
"github.com/SigNoz/signoz/pkg/valuer"
|
|
)
|
|
|
|
type granter struct {
|
|
store roletypes.Store
|
|
authz authz.AuthZ
|
|
}
|
|
|
|
func NewGranter(store roletypes.Store, authz authz.AuthZ) role.Granter {
|
|
return &granter{store: store, authz: authz}
|
|
}
|
|
|
|
func (granter *granter) Grant(ctx context.Context, orgID valuer.UUID, name string, subject string) error {
|
|
role, err := granter.store.GetByOrgIDAndName(ctx, orgID, name)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
tuples, err := authtypes.TypeableRole.Tuples(
|
|
subject,
|
|
authtypes.RelationAssignee,
|
|
[]authtypes.Selector{
|
|
authtypes.MustNewSelector(authtypes.TypeRole, role.ID.StringValue()),
|
|
},
|
|
orgID,
|
|
)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return granter.authz.Write(ctx, tuples, nil)
|
|
}
|
|
|
|
func (granter *granter) GrantByID(ctx context.Context, orgID valuer.UUID, id valuer.UUID, subject string) error {
|
|
tuples, err := authtypes.TypeableRole.Tuples(
|
|
subject,
|
|
authtypes.RelationAssignee,
|
|
[]authtypes.Selector{
|
|
authtypes.MustNewSelector(authtypes.TypeRole, id.StringValue()),
|
|
},
|
|
orgID,
|
|
)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return granter.authz.Write(ctx, tuples, nil)
|
|
}
|
|
|
|
func (granter *granter) ModifyGrant(ctx context.Context, orgID valuer.UUID, existingRoleName string, updatedRoleName string, subject string) error {
|
|
err := granter.Revoke(ctx, orgID, existingRoleName, subject)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = granter.Grant(ctx, orgID, updatedRoleName, subject)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (granter *granter) Revoke(ctx context.Context, orgID valuer.UUID, name string, subject string) error {
|
|
role, err := granter.store.GetByOrgIDAndName(ctx, orgID, name)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
tuples, err := authtypes.TypeableRole.Tuples(
|
|
subject,
|
|
authtypes.RelationAssignee,
|
|
[]authtypes.Selector{
|
|
authtypes.MustNewSelector(authtypes.TypeRole, role.ID.StringValue()),
|
|
},
|
|
orgID,
|
|
)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return granter.authz.Write(ctx, nil, tuples)
|
|
}
|
|
|
|
func (granter *granter) CreateManagedRoles(ctx context.Context, _ valuer.UUID, managedRoles []*roletypes.Role) error {
|
|
err := granter.store.RunInTx(ctx, func(ctx context.Context) error {
|
|
for _, role := range managedRoles {
|
|
err := granter.store.Create(ctx, roletypes.NewStorableRoleFromRole(role))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
})
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|