Documentation
¶
Overview ¶
Package acl provides typed subject-to-resource access control lists.
Example ¶
package main
import (
"context"
"fmt"
authorization "github.com/faustbrian/go-authorization"
"github.com/faustbrian/go-authorization/acl"
)
func main() {
accessList, err := acl.New([]acl.Entry{
{
ID: "reader",
Subject: authorization.Subject{
Kind: authorization.SubjectUser,
ID: "alice",
},
Action: "document.read",
ResourceType: "document",
Effect: authorization.Allow,
},
})
if err != nil {
panic(err)
}
decision, err := accessList.Evaluate(context.Background(), authorization.Request{
Subject: authorization.Subject{
Kind: authorization.SubjectUser,
ID: "alice",
},
Action: "document.read",
Resource: authorization.Resource{
Type: "document",
ID: "document-1",
},
})
if err != nil {
panic(err)
}
fmt.Println(decision.Outcome == authorization.Allow)
}
Output: true
Index ¶
- Constants
- Variables
- func EncodeDocument(document Document) ([]byte, error)
- type Decoder
- type Document
- type Entry
- type EntryDocument
- type EntryID
- type Evaluator
- func (evaluator *Evaluator) Evaluate(ctx context.Context, request authorization.Request) (authorization.Decision, error)
- func (evaluator *Evaluator) EvaluateBatch(ctx context.Context, requests []authorization.Request) ([]authorization.Decision, error)
- func (evaluator *Evaluator) ListResourceIDs(ctx context.Context, subject authorization.Subject, ...) ([]authorization.ResourceID, error)
- type Limits
- type Option
Examples ¶
Constants ¶
const ( ReasonAllow authorization.ReasonCode = "acl-allow" ReasonExplicitDeny authorization.ReasonCode = "acl-explicit-deny" ReasonLimitExceeded authorization.ReasonCode = "acl-limit-exceeded" )
const ( EffectAllow = "allow" EffectDeny = "deny" )
const DocumentVersion uint64 = 1
Variables ¶
var ( ErrInvalidEntry = errors.New("invalid ACL entry") ErrDuplicateEntry = errors.New("duplicate ACL entry") ErrEntryLimitExceeded = errors.New("ACL entry limit exceeded") ErrGroupLimitExceeded = errors.New("ACL group limit exceeded") ErrMatchLimitExceeded = errors.New("ACL match limit exceeded") ErrBatchLimitExceeded = errors.New("ACL batch limit exceeded") ErrUnboundedResourceSet = errors.New("ACL resource set is unbounded") )
Functions ¶
func EncodeDocument ¶
Types ¶
type Decoder ¶
type Decoder struct{}
func (Decoder) Decode ¶
func (Decoder) Decode(document json.RawMessage) (authorization.Evaluator, error)
type Document ¶
type Document struct {
Version uint64 `json:"version"`
GlobalInheritance bool `json:"global_inheritance,omitempty"`
Limits Limits `json:"limits,omitempty"`
Entries []EntryDocument `json:"entries"`
}
type Entry ¶
type Entry struct {
ID EntryID
Subject authorization.Subject
Action authorization.Action
ResourceType authorization.ResourceType
ResourceID authorization.ResourceID
Tenant authorization.TenantID
Effect authorization.Outcome
}
Entry grants or denies one subject an action on a resource type or instance.
type EntryDocument ¶
type EntryDocument struct {
ID EntryID `json:"id"`
SubjectKind authorization.SubjectKind `json:"subject_kind"`
SubjectID authorization.SubjectID `json:"subject_id"`
Action authorization.Action `json:"action"`
ResourceType authorization.ResourceType `json:"resource_type"`
ResourceID authorization.ResourceID `json:"resource_id,omitempty"`
Tenant authorization.TenantID `json:"tenant,omitempty"`
Effect string `json:"effect"`
}
type EntryID ¶
type EntryID = authorization.PolicyID
type Evaluator ¶
type Evaluator struct {
// contains filtered or unexported fields
}
Evaluator resolves immutable ACL entries without external I/O.
func DecodeDocument ¶
func (*Evaluator) Evaluate ¶
func (evaluator *Evaluator) Evaluate( ctx context.Context, request authorization.Request, ) (authorization.Decision, error)
Evaluate checks matching type and instance entries for one request.
func (*Evaluator) EvaluateBatch ¶
func (evaluator *Evaluator) EvaluateBatch( ctx context.Context, requests []authorization.Request, ) ([]authorization.Decision, error)
EvaluateBatch evaluates a bounded request set against the evaluator's immutable ACL view.
func (*Evaluator) ListResourceIDs ¶
func (evaluator *Evaluator) ListResourceIDs( ctx context.Context, subject authorization.Subject, action authorization.Action, resourceType authorization.ResourceType, tenant authorization.TenantID, ) ([]authorization.ResourceID, error)
ListResourceIDs returns only explicitly enumerable instance grants. A resource-type allow is reported as unbounded instead of triggering a scan.
type Limits ¶
type Limits struct {
MaxEntries int `json:"max_entries,omitempty"`
MaxGroups int `json:"max_groups,omitempty"`
MaxMatches int `json:"max_matches,omitempty"`
MaxBatchSize int `json:"max_batch_size,omitempty"`
}
Limits bounds ACL construction and per-request evaluation work.
type Option ¶
type Option func(*Evaluator)
func WithGlobalInheritance ¶
func WithGlobalInheritance() Option
WithGlobalInheritance makes global entries apply to tenant-scoped requests. Without this option, global and tenant scopes are isolated.
func WithLimits ¶
WithLimits configures positive bounds while retaining safe defaults for zero-valued fields.