Before you start
This guide assumes you are familiar with the following OpenFGA concepts:- A Type: a class of objects that have similar characteristics
- A User: an entity in the system that can be related to an object
- A Relation: is a string defined in the type definition of an authorization model that defines the possibility of a relationship between an object of the same type as the type definition and a user in the system
- An Object: represents an entity in the system. Users’ relationships to it can be defined through relationship tuples and the authorization model
- A Relationship Tuple: a grouping consisting of a user, a relation and an object stored in OpenFGA
- Intersection Operator: the intersection operator can be used to indicate a relationship exists if the user is in all the sets of users
Step by step
The document below is an example of a relational authorization model. In this model, you can assign users to theeditor relation. The editor relation has write privileges that regular users do not.
In this scenario, you will migrate the following model:
There are existing relationship tuples associated with editor relation.
01. Create a backwards compatible model
To avoid service disruption, you will create a backwards compatible model. The backwards compatible model ensures the existing relationship tuple will still work. In the example below,user:Anne still has write privileges to the document:roadmap resource.
Test the can_edit definition. It should produce a value of true.
02. Create a new relationship tuple
Now that you have a backwards compatible model, you can create new relationship tuples with a new relation. In this example, you will add Bethany to thewriter relationship.
Run a check in the API for Bethany to ensure correct access.
03. Migrate the existing relationship tuples
Next, migrate the existing relationship tuples. The new relation makes this definition obsolete. Use theread API to look up all relationship tuples.
Initialize the SDK for Read
Initialize the SDK for Read
Set
FGA_API_URL for your service (for example, https://api.fga.example) and FGA_STORE_ID for your store. Use the Read SDK initialization examples, then place this request in the same scope as the client. For Python, use the async with block; for Go, .NET, and Java, use the method that initializes the client. See SDK client setup for authentication options.- Node.js
- Go
- .NET
- Python
- Java
- CLI
- curl
- Pseudocode
Response
document and editor respectively), and update the new tuples with the write relationship.
Finally, remove the old relationship tuples.
Perform a
write operation before a delete operation to ensure Anne still has access.04. Remove obsolete relationship from the model
After you remove the previous relationship tuples, update your authorization model to remove the obsolete relation. Now, thewrite API will only accept the new relation name.
Related Sections
Review the following sections for more information on managing relationship tuples.Relationship Queries
Understand the differences between check, read, expand and list objects.
Production Best Practices
Learn the best practices of running OpenFGA in a production environment