Documentation ¶
Overview ¶
Package fgax includes client libraries to interact with openfga authorization credit to https://github.com/canonical/ofga/blob/main/tuples.go
Index ¶
- Constants
- Variables
- func Healthcheck(client Client) func(ctx context.Context) error
- func ListContains(entityType string, l []string, i string) bool
- type AccessCheck
- type Client
- func (c *Client) AddOrReplaceRole(ctx context.Context, r RoleRequest) error
- func (c *Client) CheckAccess(ctx context.Context, ac AccessCheck) (bool, error)
- func (c *Client) CheckGroupAccess(ctx context.Context, userID, groupID, relation string) (bool, error)
- func (c *Client) CheckOrgAccess(ctx context.Context, userID, orgID, relation string) (bool, error)
- func (c *Client) CheckSystemAdminRole(ctx context.Context, userID string) (bool, error)
- func (c *Client) CheckTuple(ctx context.Context, check ofgaclient.ClientCheckRequest) (bool, error)
- func (c *Client) CreateModel(ctx context.Context, model ofgaclient.ClientWriteAuthorizationModelRequest) (string, error)
- func (c *Client) CreateModelFromDSL(ctx context.Context, dsl []byte) (string, error)
- func (c *Client) CreateModelFromFile(ctx context.Context, fn string, forceCreate bool) (string, error)
- func (c *Client) CreateStore(ctx context.Context, storeName string) (string, error)
- func (c *Client) DeleteAllObjectRelations(ctx context.Context, object string) error
- func (c *Client) DeleteRelationshipTuple(ctx context.Context, tuples []openfga.TupleKeyWithoutCondition) (*ofgaclient.ClientWriteResponse, error)
- func (c *Client) GetModelID() string
- func (c *Client) ListObjectsRequest(ctx context.Context, userID, objectType, relation string) (*ofgaclient.ClientListObjectsResponse, error)
- func (c *Client) WriteTupleKeys(ctx context.Context, writes []TupleKey, deletes []TupleKey) (*ofgaclient.ClientWriteResponse, error)
- type Config
- type Entity
- type InvalidEntityError
- type Kind
- type Option
- type Relation
- type RelationCombination
- type RelationSetting
- type RoleRequest
- type TupleKey
- type WritingTuplesError
Constants ¶
const ( // SystemAdminRole is the role for system admins that have the highest level of access SystemAdminRole = "system_admin" // MemberRelation is the relation for members of an entity MemberRelation = "member" // AdminRelation is the relation for admins of an entity AdminRelation = "admin" // OwnerRelation is the relation for owners of an entity OwnerRelation = "owner" // ParentRelation is the relation for parents of an entity ParentRelation = "parent" // AssigneeRoleRelation is the relation for assignees of an entity RoleRelation = "assignee" // CanView is the relation for viewing an entity CanView = "can_view" // CanEdit is the relation for editing an entity CanEdit = "can_edit" // CanDelete is the relation for deleting an entity CanDelete = "can_delete" )
setup relations for use in creating tuples
Variables ¶
var ( // ErrFGAMissingHost is returned when a host is not provided ErrFGAMissingHost = errors.New("invalid OpenFGA config: missing host") // ErrMissingRelation is returned when a relation is empty in a tuple creation ErrMissingRelation = errors.New("unable to create tuple, missing relation") // ErrInvalidAccessCheck is returned when a field required to check a tuple is empty ErrInvalidAccessCheck = errors.New("unable to check tuple, missing required field") // ErrMissingObject is returned when a object is empty in a tuple creation ErrMissingObject = errors.New("unable to create tuple, missing object") // ErrMissingObjectOnDeletion is returned when a object is empty in a tuple deletion ErrMissingObjectOnDeletion = errors.New("unable to delete tuple, missing object") // ErrFailedToTransformModel is returned when the FGA model cannot be transformed to JSON ErrFailedToTransformModel = errors.New("failed to transform fga model") )
Functions ¶
func Healthcheck ¶
Healthcheck reads the model to check if the connection is working
Types ¶
type AccessCheck ¶
type AccessCheck struct { // ObjectType is the type of object being checked ObjectType Kind // ObjectID is the ID of the object being checked ObjectID string // Relation is the relationship being checked (e.g. "view", "edit", "delete") Relation string // UserID is the ID of the user making the request UserID string }
AccessCheck is a struct to hold the information needed to check access
type Client ¶
type Client struct { // Ofga is the openFGA client Ofga ofgaclient.SdkClient // Config is the client configuration Config ofgaclient.ClientConfiguration // Logger is the provided Logger Logger *zap.SugaredLogger }
Client is an ofga client with some configuration
func CreateFGAClientWithStore ¶
CreateFGAClientWithStore returns a Client with a store and model configured
func NewClient ¶
NewClient returns a wrapped OpenFGA API client ensuring all calls are made to the provided authorization model (id) and returns what is necessary.
func NewMockFGAClient ¶
func NewMockFGAClient(t *testing.T, c *mock_fga.MockSdkClient) *Client
NewMockFGAClient is a mock client based on the mockery testing framework
func (*Client) AddOrReplaceRole ¶
func (c *Client) AddOrReplaceRole(ctx context.Context, r RoleRequest) error
AddOrReplaceRole adds (or replaces the existing) the role to the model and updates the config with the new model id
func (*Client) CheckAccess ¶
CheckAccess checks if the user has access to the object type with the given relation
func (*Client) CheckGroupAccess ¶
func (c *Client) CheckGroupAccess(ctx context.Context, userID, groupID, relation string) (bool, error)
CheckGroupAccess checks if the user has access to the group with the given relation
func (*Client) CheckOrgAccess ¶
CheckOrgAccess checks if the user has access to the organization with the given relation
func (*Client) CheckSystemAdminRole ¶
CheckSystemAdminRole checks if the user has system admin access
func (*Client) CheckTuple ¶
func (c *Client) CheckTuple(ctx context.Context, check ofgaclient.ClientCheckRequest) (bool, error)
CheckTuple checks the openFGA store for provided relationship tuple
func (*Client) CreateModel ¶
func (c *Client) CreateModel(ctx context.Context, model ofgaclient.ClientWriteAuthorizationModelRequest) (string, error)
CreateModel creates a new authorization model and returns the new model ID
func (*Client) CreateModelFromDSL ¶
CreateModelFromDSL creates a new fine grained authorization model from the DSL and returns the model ID
func (*Client) CreateModelFromFile ¶
func (c *Client) CreateModelFromFile(ctx context.Context, fn string, forceCreate bool) (string, error)
CreateModelFromFile creates a new fine grained authorization model and returns the model ID
func (*Client) CreateStore ¶
CreateStore creates a new fine grained authorization store and returns the store ID
func (*Client) DeleteAllObjectRelations ¶
func (*Client) DeleteRelationshipTuple ¶
func (c *Client) DeleteRelationshipTuple(ctx context.Context, tuples []openfga.TupleKeyWithoutCondition) (*ofgaclient.ClientWriteResponse, error)
DeleteRelationshipTuple deletes a relationship tuple in the openFGA store
func (*Client) GetModelID ¶
func (*Client) ListObjectsRequest ¶
func (c *Client) ListObjectsRequest(ctx context.Context, userID, objectType, relation string) (*ofgaclient.ClientListObjectsResponse, error)
ListObjectsRequest creates the ClientListObjectsRequest and queries the FGA store for all objects with the user+relation
func (*Client) WriteTupleKeys ¶
func (c *Client) WriteTupleKeys(ctx context.Context, writes []TupleKey, deletes []TupleKey) (*ofgaclient.ClientWriteResponse, error)
WriteTupleKeys takes a tuples keys, converts them to a client write request, which can contain up to 10 writes and deletes, and executes in a single transaction
type Config ¶
type Config struct { // Enabled - checks this first before reading the config Enabled bool `json:"enabled" koanf:"enabled" jsonschema:"description=enables authorization checks with openFGA" default:"true"` // StoreName of the FGA Store StoreName string `json:"storeName" koanf:"storeName" jsonschema:"description=name of openFGA store" default:"central-server"` // HostURL of the fga API, replaces Host and Scheme settings HostURL string `` /* 147-byte string literal not displayed */ // StoreID of the authorization store in FGA StoreID string `json:"storeId" koanf:"storeId" jsonschema:"description=id of openFGA store"` // ModelID that already exists in authorization store to be used ModelID string `json:"modelId" koanf:"modelId" jsonschema:"description=id of openFGA model"` // CreateNewModel force creates a new model, even if one already exists CreateNewModel bool `` /* 138-byte string literal not displayed */ // ModelFile is the path to the model file ModelFile string `json:"modelFile" koanf:"modelFile" jsonschema:"description=path to the fga model file" default:"fga/model/central-server.fga"` }
Config configures the openFGA setup
type Entity ¶
Entity represents an entity/entity-set in OpenFGA. Example: `user:<user-id>`, `org:<org-id>#member`
func ParseEntity ¶
ParseEntity will parse a string representation into an Entity. It expects to find entities of the form:
- <entityType>:<Identifier> eg. organization:central-server
- <entityType>:<Identifier>#<relationship-set> eg. organization:central-server#member
type InvalidEntityError ¶
type InvalidEntityError struct {
EntityRepresentation string
}
InvalidEntityError is returned when an invalid openFGA entity is configured
func (*InvalidEntityError) Error ¶
func (e *InvalidEntityError) Error() string
Error returns the InvalidEntityError in string format
type Option ¶
type Option func(c *Client)
Option is a functional configuration option for openFGA client
func WithAuthorizationModelID ¶
WithAuthorizationModelID sets the authorization model ID
func WithStoreID ¶
WithStoreID sets the store IDs, not needed when calling `CreateStore` or `ListStores`
type Relation ¶
type Relation string
Relation represents the type of relation between entities in OpenFGA.
type RelationCombination ¶
type RelationCombination string
RelationCombination is the combination of the relation as an `and`, `or`, or `not`
const ( // Union is an `or` relation Union RelationCombination = "union" // Intersection is an `and` relation Intersection RelationCombination = "intersection" )
type RelationSetting ¶
type RelationSetting struct { // Relation is the relation to the object Relation string // IsDirect is the direct relation to another fga object type IsDirect bool // FromRelation is the relation from another relation, leave empty if not a from relation FromRelation string }
RelationSetting includes the name of the relation as well as flags to determine the type of relation
type RoleRequest ¶
type RoleRequest struct { // Role is the relation to add to the model Role string // Relation is the relation to the object Relations []RelationSetting // RelationCombination is the combination of the relation RelationCombination RelationCombination // ObjectType is the object type to add the role to ObjectType string }
RoleRequest is the request to add a role to the model for an existing object
type TupleKey ¶
func GetTupleKey ¶
GetTupleKey creates a Tuple key with the provided subject, object, and role
func NewTupleKey ¶
func NewTupleKey() TupleKey
type WritingTuplesError ¶
type WritingTuplesError struct { User string Relation string Object string Operation string ErrorResponse error }
WritingTuplesError is returned when an error is returned writing a relationship tuple
func (*WritingTuplesError) Error ¶
func (e *WritingTuplesError) Error() string
Error returns the InvalidEntityError in string format
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
Package entfga is an ent extension that creates hooks for OpenFGA relationships
|
Package entfga is an ent extension that creates hooks for OpenFGA relationships |
Package client includes the mock FGA client generated by testify mockery
|
Package client includes the mock FGA client generated by testify mockery |