Roles and Permissions

Access Control

You can set permissions on each model for user groups which you can define yourself. There are also a few special groups:

Each group can have one, some or all of the following permissions:

The permissions are defined in the model as follows:

TestSchema.set("_perms", {
    admin: "crud", // CRUD = Create, Retrieve, Update and Delete
    owner: "rud",
    user: "cr",
    all: "r" // Unauthenticated users will be able to read from test, but that is all
});

In this case, the admin and record owner have full permissions. (We don't need to set "create" for the owner, obvz.) An authenticated user can create and retrive records. Everyone can read everything.

To make a model completely private, just don't set the perms.

Groups

You can add and remove groups to a user with the /groups/:user_id endpoint. The group will be automatically created if it doesn't already exist.

The field needs to be named group. You can even have an array of groups, eg. group[0], group[1] etc.

Example

Note that you'll need to authenticate as an admin through one of the methods described for these examples

Set the user's group to test

curl -X POST -F "group=test" "http://localhost:3001/groups/5485bd62fbad8791660d2658"

Add the groups test1 and test2

curl -X PUT -F "group[0]=test0" -F "group[1]=test1" "http://localhost:3001/groups/5485bd62fbad8791660d2658"

Adding custom permission logic

Maybe you want to do some more checks on permissions than the "crud" we offer. You can catch the user object in your model as a virtual attribute. (I suppose you could use a real Mixed attribute too.)

Eg.

var sender;

LedgerSchema.virtual("__user").set(function(usr) {
    sender = usr;
});

And then later, say in your pre- or post-save...

(!sender.admin)) {
    return next(new Error( "Verboten!"));
}