Go Authorization Library

Oso is a batteries-included library for building authorization in Go.

  • It's embedded in your application—no extra processes to run.
  • Oso uses your data models. Pass Go structs to Oso, and your authorization policy can refer to properties on those objects.
  • Oso comes with built-in primitives for common authorization patterns like role-based access control (RBAC) and relationship-based access control (ReBAC).
  • Oso provides APIs for yes/no authorization decisions, as well as authorization over list endpoints.

A single-line Go authorization API.

The Go authorization API is:

oso.Authorize(actor, action, resource)

Here's an example in a Go server:

oso.Authorize(GetCurrentUser(), "read", GetRepositoryByName(repoName))

Express your authorization model.

To model authorization with Oso, you write a policy in Polar, Oso’s declarative policy language.

For instance:

  • Individual permissions take the form:
allow(actor, _action, _resource) if
  actor.Email = "alice@example.com";
  • RBAC means grouping permissions into roles (e.g., User, Moderator, and Admin roles—or whichever roles your app needs), and assigning those roles to users. Oso supports role-based access control (RBAC) natively.
allow(actor, action, resource) if has_permission(actor, action, resource);

has_role(actor: User, role_name: String, post: Post) if
  role in actor.Roles and
  role_name = role.Name and
  post = role.Post;

actor User {}

resource Post {
  permissions = ["read", "edit", "delete"];
  roles = ["user", "moderator", "admin"];

  "read" if "user";
  "edit" if "moderator";
  "delete" if "admin";

  "user" if "moderator";
  "moderator" if "admin";
}

For an implementation guide, read our guide on building role-based access control with Oso, or for background reading, see our technology-agnostic Authorization Academy guide to RBAC.

  • Relationship-based authorization, or ReBAC, means organizing permissions based on relationships between resources. For instance, allowing only the user who created a post to edit it. Relationships include data ownership, parent-child relationships, groups, and hierarchies. Oso provides primitives for hierarchies, relationship-based access control (ReBAC) and attribute-based access control (ABAC).
allow(actor, action, resource) if has_permission(actor, action, resource);

resource Organization {
    permissions = ["read", "add_member"];
    roles = ["member", "owner"];
}

resource Repository {
    permissions = ["read", "push"];
    roles = ["contributor", "maintainer", "admin"];
    relations = { parent: Organization };

    "admin" if "owner" on "parent";
}

For a guide on parent-child implementing role relationships like the one shown above, see our documentation on granting a role on a child resource to a role on the parent. For a guide to building resource hierarchies (e.g., things that look like filesystems), take a look at our guide on building authorization for resource hierarchies. You can also read our technology-agnostic Authorization Academy guide to ReBAC.

Test your authorization.

You can test the surface of your policy by testing the return value of your Oso.authorize call. Here's an example with the testing package:

func TestMaintainersCannotDeleteRepos(t *testing.T) {
    repo := Repository{ Id: 1, Name: "oso" }
    user := RepositoryRole{ Role: "maintainer", RepoId: 1 }
    e := oso.Authorize(user, "delete", repo)
    if e == nil {
        t.Error("expected an error, got nil")
    }
    _, te := e.(*errors.NotFoundError)
    if !te {
        t.Error("expected a NotFoundError")
    }
}

You can also query individual policy rules to rest them. This allows you to TDD your authorization.

Learn authorization concepts, architecture, and best practices.

We've written the Authorization Academy to help you get started with authorization. These guides aren't specific to Oso, and cover industry-standard authorization concepts. Learn:

  • How to architect your app for authorization.
  • Common authorization models like role-based access control (RBAC) and relationship-based access control (ReBAC) – like when to use them and how to implement them.
  • Where to enforce authorization at various layers in your app.

How to get started

Add Oso to your app with go get [github.com/osohq/go-oso](http://github.com/osohq/go-oso), then start modeling your authorization logic.

Then, join the community of hundreds of developers in the Oso Slack! We'd love to talk about what you're working on and answer any questions you have.

Get started with Oso

Want help thinking through authorization in your app?

Explore our docs

Access guides, example apps, and authorization best practies.
Read Oso docs

Connect on Slack

Get help from our team, and talk with hundreds of like-minded developers.
Join the Slack

Meet with us 1x1

Schedule time with an Oso engineer to help model your permissions.
Schedule your 1x1