# Django Forbid <img src="https://github.com/pysnippet.png" align="right" height="64" />
Secure your Django app by controlling the access - grant or deny user access based on device and location, including VPN
detection.
[](https://pypi.org/project/django-forbid/)
[](https://pypi.org/project/django-forbid/)
[](https://pypi.org/project/django-forbid/)
[](https://github.com/pysnippet/django-forbid/blob/master/LICENSE)
[](https://github.com/pysnippet/django-forbid/actions/workflows/tests.yml)
## Install
```shell
python -m pip install django-forbid
```
## Configuration
Add the `django_forbid.apps.ForbidConfig` to your `INSTALLED_APPS` in your Django project's **settings.py** file.
```python
INSTALLED_APPS = [
..., # other apps
'django_forbid.apps.ForbidConfig',
]
```
Also, add the `django_forbid.middleware.ForbidMiddleware` to the `MIDDLEWARE` list of the project.
```python
MIDDLEWARE = [
..., # other middlewares
'django_forbid.middleware.ForbidMiddleware',
]
```
Configuring the `GEOIP_PATH` variable in your project's settings is important. This variable should contain the path to
the GeoLite2 database file. You should [download](https://dev.maxmind.com/geoip/geoip2/geolite2/) the database and
follow the Django [documentation](https://docs.djangoproject.com/en/2.1/ref/contrib/gis/geoip2/#settings) for proper
configuration.
## Usage
After connecting the Django Forbid to your project, you can define the set of desired zones to be forbidden or allowed.
All you need is to set the `DJANGO_FORBID` variable in your project's settings. It should be a dictionary with the
following keys:
- `DEVICES` - list of devices to permit or forbid access to
- `COUNTRIES` - list of countries to permit or forbid access to
- `TERRITORIES` - list of territories to permit or forbid access to
- `OPTIONS` - a dictionary for additional settings
- `ACTION` - whether to `PERMIT` or `FORBID` access to the listed zones (default is `FORBID`)
- `PERIOD` - time in seconds to check for access again, 0 means on each request
- `VPN` - use VPN detection and forbid access to VPN users
- `URL` - set of URLs to redirect to when the user is located in a forbidden country or using a VPN
- `FORBIDDEN_LOC` - the URL to redirect to when the user is located in a forbidden country
- `FORBIDDEN_VPN` - the URL to redirect to when the user is using a VPN
- `FORBIDDEN_KIT` - the URL to redirect to when the user is using a forbidden device
Unlike the `COUNTRIES` and `TERRITORIES`, where the middleware decides whether to permit or forbid access based on the
given `ACTION` value, the `DEVICES` list accepts device types where the names starting with `!` are forbidden. This is
done to make it possible to make them all mix together.
```python
# Forbid access to all devices that have a small screen.
'DEVICES': ['!car', '!player', '!peripheral', '!camera']
# Allow access to all devices having regular or large screens.
'DEVICES': ['desktop', 'smartphone', 'console', 'tablet', 'tv']
```
The available device types are: `smartphone`, `peripheral` - refers to all hardware components that are attached to a
computer, `wearable` - common types of wearable technology include smartwatches and smartglasses, `phablet` - a
smartphone having a larger screen, `console` - PlayStation, Xbox, etc., `display`, `speaker` - Google Assistant, Siri,
Alexa, etc., `desktop`, `tablet`, `camera`, `player` - iPod, Sony Walkman, Creative Zen, etc., `phone`, `car` - refers
to a car browser and `tv` - refers to TVs having internet access.
```python
DJANGO_FORBID = {
'DEVICES': ['desktop', 'smartphone', 'console', 'tablet', 'tv'],
'COUNTRIES': ['US', 'GB'],
'TERRITORIES': ['EU'],
'OPTIONS': {
'ACTION': 'PERMIT',
'PERIOD': 300,
'VPN': True,
'URL': {
'FORBIDDEN_LOC': 'forbidden_location',
'FORBIDDEN_VPN': 'forbidden_network',
'FORBIDDEN_KIT': 'forbidden_device',
},
},
}
```
The available country codes in the required ISO 3166 alpha-2 format are
listed [here](https://www.iban.com/country-codes). And the available continent codes (territories) are: `AF` -
Africa, `AN` - Antarctica, `AS` - Asia, `EU` - Europe, `NA` - North America, `OC` - Oceania and `SA` - South America.
_None of the settings are required. If you don't specify any settings, the middleware will not do anything._
## Contribute
Any contribution is welcome. If you have any ideas or suggestions, feel free to open an issue or a pull request. And
don't forget to add tests for your changes.
## License
Copyright (C) 2023 Artyom Vancyan. [MIT](https://github.com/pysnippet/django-forbid/blob/master/LICENSE)