An authorization middleware for FastAPI that supports ACL, RBAC, ABAC, based on PyCasbin
Project description
fastapi-authz
fastapi-authz is an authorization middleware for FastAPI, it's based on PyCasbin.
Installation
Install from pip
pip install fastapi-authz
Clone this repo
git clone https://github.com/pycasbin/fastapi-authz.git
python setup.py install
Quickstart
This middleware is designed to work with another middleware which implement AuthenticationMiddleware
interface.
import base64
import binascii
import casbin
from fastapi import FastAPI
from starlette.authentication import AuthenticationBackend, AuthenticationError, SimpleUser, AuthCredentials
from starlette.middleware.authentication import AuthenticationMiddleware
from fastapi_authz import CasbinMiddleware
app = FastAPI()
class BasicAuth(AuthenticationBackend):
async def authenticate(self, request):
if "Authorization" not in request.headers:
return None
auth = request.headers["Authorization"]
try:
scheme, credentials = auth.split()
decoded = base64.b64decode(credentials).decode("ascii")
except (ValueError, UnicodeDecodeError, binascii.Error):
raise AuthenticationError("Invalid basic auth credentials")
username, _, password = decoded.partition(":")
return AuthCredentials(["authenticated"]), SimpleUser(username)
enforcer = casbin.Enforcer('../examples/rbac_model.conf', '../examples/rbac_policy.csv')
app.add_middleware(CasbinMiddleware, enforcer=enforcer)
app.add_middleware(AuthenticationMiddleware, backend=BasicAuth())
@app.get('/')
async def index():
return "If you see this, you have been authenticated."
@app.get('/dataset1/protected')
async def auth_test():
return "You must be alice to see this."
- anonymous request
curl -i http://127.0.0.1:8000/dataset1/protected
HTTP/1.1 403 Forbidden
date: Mon, 01 Mar 2021 09:00:08 GMT
server: uvicorn
content-length: 11
content-type: application/json
"Forbidden"
- authenticated request
curl -i -u alice:password http://127.0.0.1:8000/dataset1/protected
HTTP/1.1 200 OK
date: Mon, 01 Mar 2021 09:04:54 GMT
server: uvicorn
content-length: 32
content-type: application/json
"You must be alice to see this."
It used the casbin config from examples
folder, and you can find this demo in demo
folder.
You can also view the unit tests to understand this middleware.
Besides, there is another example for CasbinMiddleware
which is designed to work with JWT authentication. You can find
it in demo/jwt_test.py
.
Development
Run unit tests
- Fork/Clone repository
- Install fastapi-authz dependencies, and run
pytest
pip install -r dev_requirements.txt
pip install -r requirements.txt
pytest
Update requirements with pip-tools
# update requirements.txt
pip-compile --no-annotate --no-header --rebuild requirements.in
# sync venv
pip-sync
Manually Bump Version
bumpversion major # major release
or
bumpversion minor # minor release
or
bumpversion patch # hotfix release
Documentation
The authorization determines a request based on {subject, object, action}
, which means what subject
can perform
what action
on what object
. In this plugin, the meanings are:
subject
: the logged-in user nameobject
: the URL path for the web resource likedataset1/item1
action
: HTTP method like GET, POST, PUT, DELETE, or the high-level actions you defined like "read-file", " write-blog" (currently no official support in this middleware)
For how to write authorization policy and other details, please refer to the Casbin's documentation.
Getting Help
License
This project is under Apache 2.0 License. See the LICENSE file for the full license text.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file fastapi-authz-1.0.0.tar.gz
.
File metadata
- Download URL: fastapi-authz-1.0.0.tar.gz
- Upload date:
- Size: 8.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.12.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | d022cefc8ec93e43d98825bafcc4ea145636b79a072bda2fc95b1051f19f608e |
|
MD5 | 40098f18758c0d5131bca3c0db97e380 |
|
BLAKE2b-256 | 636b92f34fa9aaf9916cf767a8edd813435b81d15affd05e003670635ff59ca4 |
File details
Details for the file fastapi_authz-1.0.0-py3-none-any.whl
.
File metadata
- Download URL: fastapi_authz-1.0.0-py3-none-any.whl
- Upload date:
- Size: 10.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.12.2
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | e8170604d2a9c487fb69fa4d358580c5b0d6398c2278d68293441117d51d0acf |
|
MD5 | 69a1e35b1bc41528507a10fc0b1fb942 |
|
BLAKE2b-256 | b5ebc8c8d2e83990461881d0d9ae66ad702426fac05e8715d617d069c1fd3ad8 |