express-ip-access-control
Version:
An express.js middleware for access control.
117 lines (77 loc) • 3.99 kB
Markdown
Express IP Access Control
=========================
An express middleware for access control base on IP addresses.
Installation
------------
> `npm i express-ip-access-control`
Features
--------
* Control who can access resources base on IP addresses.
* Support **Express 4**.
* Support **IPv4**, **IPv6**, **CIDR format** & **IPv4 mapped IPv6 addresses** (using [ipaddr.js](https://github.com/whitequark/ipaddr.js)).
* Deny mode (**Blacklist**) & Allow mode (**Whitelist**).
* Choose from **connection address or real address**. You may find it useful if you are behind proxy and needed to reject direct access.
* Custom action on denied. (**Redirect** or **show error message**)
* Custom log function.
Usage
-----
> You may want to know somethings about [Express](http://expressjs.com) and [Express's middleware](http://expressjs.com/guide/using-middleware.html) first.
```javascript
var AccessControl = require('express-ip-access-control');
// Create middleware.
var middleware = AccessControl(options);
// Or directly load it into the app.
var express = require('express');
var app = express();
app.use(AccessControl(options));
```
Options
-------
```javascript
var options = {
mode: 'deny',
denys: [],
allows: [],
forceConnectionAddress: false,
log: function(clientIp, access) {
console.log(clientIp + (access ? ' accessed.' : ' denied.'));
},
statusCode: 401,
redirectTo: '',
message: 'Unauthorized'
};
```
### mode (default: `'deny'`)
#### `'deny'` mode (Blacklist)
Allow by default, only deny IPs in the blacklist (`denys`) and not excluded by the whitelist (`allows`).
#### `'allow'` mode (Whilelist)
Deny by default, only allow IPs in the whitelist (`allows`) and not excluded by the blacklist (`denys`).
### denys (default: `[]`)
The blacklist. Works differently in different mode. Support IPv4, IPv6, CIDR format or mixed. IPv4 mapped IPv6 addresses will be converted into IPv4.
### allows (default: `[]`)
The whitelist. Works differently in different mode. Support IPv4, IPv6, CIDR format or mixed. IPv4 mapped IPv6 addresses will be converted into IPv4.
### forceConnectionAddress (default: `false`)
If set to `true`, the connection address (`req.connection.remoteAddress`) will be used even `express.set('trust proxy', [])` set the `req.ip`. So that you can reject direct access if you are behind proxy and needed to do so.
### log (default: *Simple log function*)
Pass a log function or `false` to disable log.
The function should have signature like this `Function(String clientIp, Boolean access)`.
### statusCode (default: `401`)
The HTTP status code sent when denied. Set to `301` or `302` means redirect to `redirectTo`. Will be `parseInt(statusCode, 10)` to ensure it is a integer.
### redirectTo (default: `''`)
The URL to redirect when denied and `statusCode` is set to redirect. It will be passed into [`res.redirect(statusCode, redirectTo)`](http://expressjs.com/4x/api.html#res.redirect) directly, without any validation or manipulation.
### message (default: `'Unauthorized'`)
The message sent when denied and `statusCode` is not set to redirect. It will be passed into [`res.send(message)`](http://expressjs.com/4x/api.html#res.send) directly, without any validation or manipulation.
## Functions
### ipMatch()
```javascript
AccessControl.ipMatch(clientIp, list);
```
Return `true` if `clientIp` is in the `list`, `false` if not. The function will return `false` if the `clientIp` is not valid or the `list` is empty.
* (String) `clientIp` is the IP address (IPv4 / IPv6) to check. IPv4 mapped IPv6 addresses will be converted into IPv4.
* (Array of String) `list` is the list / range of IP address. Support IPv4, IPv6, CIDR format or mixed. IPv4 mapped IPv6 addresses will be converted into IPv4.
Repository
----------
You may find the source code on [GitHub](https://github.com/KennyTangHK/express-ip-access-control). Please feel free to report bugs and contribute your changes.
License
-------
[MIT](LICENSE)