ability
Version:
A simple route-based ACL component for expressjs.
117 lines (81 loc) • 2.9 kB
Markdown
## Ability-js
A simple route-based ACL component for express.js. This won't handle actual authentication, you can use everyauth for that.
## Installing
npm install ability
## With everyauth:
This assumes you have, in your everyauth setup, a field called "role" (customizable, see below). For example, if you're using facebook:
```javascript
everyauth.facebook.extractExtraRegistrationParams( function (req) {
return {
role: "some default role"
}
});
```
Obviously this doesn't make much sense without persistence, so you can change the roles, but you can achieve that with mongoose-auth or a custom solution.
If you have everyauth working in an expressjs app, all you have to do to your app.js is add the following
```javascript
abilities = {
editor: {
index: ['read'],
protected: ['read']
},
default: {
index: ['read'],
}
}
var ability = require('ability');
ability.add(abilities);
```
This is route-based, and assumes you're going to have 2 routes, `app.get /protected` and `app.get /`.
**Note**: You must specify a 'default'.
Then, in the route:
```javascript
app.get('/protected', function(req, res) {
authorize();
res.render('protected');
});
```
This will check to see if the user is authorized based on the setup above. According to the above setup, an un-authenticated user would not be authorized for this route.
Optionally, you can specify the action and route:
```javascript
app.get('/protected', function(req, res) {
authorize('read', 'index');
res.render('protected');
});
```
Even further, you can specify the role you want to check
```javascript
app.get('/protected', function(req, res) {
authorize('read', 'index', 'default');
res.render('protected');
});
```
###Route translations:
On the routes, you may specify one of 4 options, 'read', 'write', 'delete', or 'all'.
1. Read -> Get
2. Write -> Put/post
3. Delete -> Delete
4. All -> Read/Write/Delete
###View helpers
In jade:
p= able.to('read', 'protected')
In EJS:
<%- able.to('read', 'protected')>
## Options
ability = require('ability');
ability.configure({
redirect: true,
role_name: role,
redirect_to: '/',
redirect_message: 'Unauthorized'
})
- redirect, whether or not to redirect to the user if they're not authorized. By default, it will redirect a user to the home page if they're not authorized, without a flash.
- redirect_to, where to redirect the user if authentication fails
- redirect_message, if you're using req.flash, it will put the messages in there
- role_name, the name of the everyauth field for your role (everyauth only)
## A simple example:
[https://github.com/scottkf/expressjs-oauth](https://github.com/scottkf/expressjs-oauth)
## Todo:
- Change helpers so you can just go can('read', 'whatever')
- Add customizeable flash message for redirect
- Flesh out tests more