security

package
v0.1.0-preview.4 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 11, 2026 License: Apache-2.0 Imports: 9 Imported by: 0

Documentation

Overview

Package security provides immutable authenticated principals and deny-by-default authorization policies for generated Spice guards.

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func Guard

func Guard(
	authorizer *Authorizer,
	policy Policy,
	onWriteFailure WriteFailure,
) (web.Middleware, error)

Guard constructs HTTP authorization middleware after validating its policy.

func ValidateExpression

func ValidateExpression(source string) error

ValidateExpression checks one restricted authorization expression against the exact symbol schema used at runtime. Compilers use this function to fail at the annotation source before generated Go is rendered.

func WithPrincipal

func WithPrincipal(ctx context.Context, principal Principal) (context.Context, error)

WithPrincipal returns a derived context containing a validated principal.

Types

type Authorizer

type Authorizer struct {
	// contains filtered or unexported fields
}

Authorizer evaluates immutable policies without a global security context.

Example
package main

import (
	"context"
	"fmt"

	"github.com/spice-framework/spice/security"
)

func main() {
	policy, err := security.NewPolicy(security.PolicySpec{
		Definition: security.Definition{
			ID:     "orders.read",
			Module: "example.com/shop/orders",
		},
		AllScopes: []string{"orders:read"},
	})
	principal, principalErr := security.NewPrincipal(
		"user-1",
		"https://issuer.example",
		nil,
		[]string{"orders:read"},
	)
	if err != nil || principalErr != nil {
		fmt.Printf("construct: %v %v\n", err, principalErr)
		return
	}
	ctx, err := security.WithPrincipal(context.Background(), principal)
	authorizer, authorizerErr := security.NewAuthorizer()
	if err == nil && authorizerErr == nil {
		err = authorizer.Authorize(ctx, policy)
	}
	fmt.Printf("authorized=%v\n", err == nil)
}
Output:
authorized=true

func NewAuthorizer

func NewAuthorizer(observers ...Observer) (*Authorizer, error)

NewAuthorizer constructs an instance-owned evaluator.

func (*Authorizer) Authorize

func (authorizer *Authorizer) Authorize(ctx context.Context, policy Policy) error

Authorize evaluates one policy against the principal in ctx.

type Decision

type Decision struct {
	Definition Definition
	Allowed    bool
	Reason     Reason
	Duration   time.Duration
}

Decision contains bounded policy metadata and no identity claims.

type Definition

type Definition struct {
	ID     string
	Module string
}

Definition identifies one compiler-owned authorization policy and module.

type DeniedError

type DeniedError struct {
	Definition Definition
	Reason     Reason
}

DeniedError is a safe authorization failure.

func (*DeniedError) Error

func (err *DeniedError) Error() string

Error returns no principal or claim data.

func (*DeniedError) Problem

func (err *DeniedError) Problem() web.Problem

Problem returns a safe RFC 9457 response.

type Observer

type Observer func(context.Context, Decision)

Observer receives completed authorization decisions synchronously.

type Policy

type Policy struct {
	// contains filtered or unexported fields
}

Policy is an immutable validated authorization policy.

func NewPolicy

func NewPolicy(spec PolicySpec) (Policy, error)

NewPolicy validates and freezes one generated policy. A policy with no requirement is rejected so zero configuration can never grant access.

func (Policy) Definition

func (policy Policy) Definition() Definition

Definition returns the policy's stable generated identity.

func (Policy) Expression

func (policy Policy) Expression() string

Expression returns the compiler-validated restricted policy expression, if one was declared. It never contains runtime identity or claim values.

type PolicySpec

type PolicySpec struct {
	Definition    Definition
	Authenticated bool
	AnyRoles      []string
	AllRoles      []string
	AllScopes     []string
	Expression    string
}

PolicySpec is the inspectable generated input to NewPolicy. Role and scope names are exact and case-sensitive.

type Principal

type Principal struct {
	// contains filtered or unexported fields
}

Principal is an immutable identity created only after authentication.

func NewPrincipal

func NewPrincipal(subject, issuer string, roles, scopes []string) (Principal, error)

NewPrincipal validates and freezes verified identity claims.

func PrincipalFromContext

func PrincipalFromContext(ctx context.Context) (Principal, bool)

PrincipalFromContext returns the authenticated principal, if present.

func (Principal) Issuer

func (principal Principal) Issuer() string

Issuer returns the verified issuer identifier.

func (Principal) Roles

func (principal Principal) Roles() []string

Roles returns a defensive copy of exact verified roles.

func (Principal) Scopes

func (principal Principal) Scopes() []string

Scopes returns a defensive copy of exact verified scopes.

func (Principal) Subject

func (principal Principal) Subject() string

Subject returns the verified subject identifier.

type Reason

type Reason string

Reason is a stable authorization decision class.

const (
	// ReasonAllowed identifies a satisfied policy.
	ReasonAllowed Reason = "allowed"
	// ReasonUnauthenticated identifies a missing principal.
	ReasonUnauthenticated Reason = "unauthenticated"
	// ReasonRole identifies an unmet role requirement.
	ReasonRole Reason = "role"
	// ReasonScope identifies an unmet scope requirement.
	ReasonScope Reason = "scope"
	// ReasonExpression identifies a restricted policy expression that evaluated
	// to false.
	ReasonExpression Reason = "expression"
)

type WriteFailure

type WriteFailure func(context.Context, error)

WriteFailure receives an HTTP response-write failure that cannot be returned through http.Handler.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL