/bottle-acl-openpolicyagent

Add Authorization to Python's Bottle Framework with Open Policy Agent

Primary LanguagePython

Bottle Authorization with Open Policy Agent

Add Authorization to Python's Bottle Framework with Open Policy Agent

About

This small example app demonstrates how to implement Access Control / Authorization in Python's Bottle Framework, using Open Policy Agent.

You can get a list of movies, delete or add movies to the list, depending on the requesting user's permissions.

The application has 2 built in users and roles:

  • John (read)
  • David (read-write)

The app comes with a simple Open Policy Agent policy.

By default, the App will query OPA locally on http://localhost:8181, you can change this by setting an environment variable: export OPA_SERVER="http://opa.server:8181"

Usage

Download OPA

Download OPA from: https://www.openpolicyagent.org/docs/latest/#running-opa

Run OPA

./opa run -s policy.rego This will start the OPA server on the localhost on port 8080

Install requirements

pip3 install -r requirements

Run Bottle App

python3 main.py

Query App using various users

get movies using an authorized user (GET)

Listing Movies with John's user should be successful, since John has read permissions.

requests.get('http://localhost:8080/movies', headers={'X-Requesting-User':'john'}).text

'{"data": ["despicable me", "borat"]}'

Add movies using an unauthorized user (POST)

Adding a movie with John's user should fail, since John does not have write permissions.

requests.post('http://localhost:8080/movies/Matrix', headers={'X-Requesting-User':'john'}).text
'{"Error": "Unauthorized"}'

Delete movies using an unauthorized user (DELETE)

Deleting a movie with John's user should fail, since John does not have write permissions.

requests.delete('http://localhost:8080/movies/Matrix', headers={'X-Requesting-User':'john'}).text
'{"Error": "Unauthorized"}'

Add movies using an authorized user (POST)

Adding a movie with David's user should be successful, since David has read-write permissions.

requests.post('http://localhost:8080/movies/Matrix', headers={'X-Requesting-User':'john'}).text
'{"data": ["despicable me", "borat", "Matrix"]}'

Delete movies using an authorized user (DELETE)

Deleting a movie with David's user should be successful, since David has read-write permissions.

requests.delete('http://localhost:8080/movies/Matrix', headers={'X-Requesting-User':'john'}).text
'{"data": ["despicable me", "borat"]}'