Sucrose v0.1.3 Sucrose

Welcome to Sucrose, a policy framework for Absinthe.

Here is a quick overview:

  1. Create a Policy Handler
  2. Put claim(s) into the context
  3. Modify your schema to include the middleware referencing your Handler

Create a Policy Handler

There are samples in the tests as well.

defmodule SampleHandler do
  def can_query?(%{claim: :reader}), do: true
  def can_query?(_), do: false
  def can_mutate?(%{claim: :author}), do: true
  def can_mutate?(_), do: false
end

This example will allow context claims with :reader to be able to query and a claim of :author to be able to mutate.

So if you use the Sucrose.Middleware.SimplePolicy, you would not be able to query as an author.

If you use the Sucrose.Middleware.SimpleOrPolicy you would be able to have both claims of [:author, :reader] then be able to read and write.

You could also do multiple pattern matches if you want to stay simple like:

def can_mutate?(%{claim: :author}), do: true
def can_mutate?(_), do: false

Put claim(s) into the context

This is out context of this documentation however you can look it up here

def call(conn, _) do
  context = build_context(conn)
  |> Map.put(:claims, [:author, :reader])
  Absinthe.Plug.put_options(conn, context: context)
end

Modify your schema

alias Sucrose.Middleware.SimplePolicy
def middleware(middleware, _field, %Absinthe.Type.Object{identifier: _ident}) do
  [
    {SimplePolicy, %{handler: SampleHandler}}
  ] ++
  middleware ++
  []
end

This will match on every type, if you want to only do for the top level, you can pattern match on the indentifier to be :mutation or :query for the top level entry points.