Skip to content

Commit

Permalink
feat: complete async_redis_adapter (#2)
Browse files Browse the repository at this point in the history
  • Loading branch information
BustDot authored Sep 17, 2023
1 parent d99e5c9 commit 7454236
Show file tree
Hide file tree
Showing 13 changed files with 735 additions and 1 deletion.
2 changes: 2 additions & 0 deletions .github/semantic.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# Always validate the PR title AND all the commits
titleAndCommits: true
101 changes: 101 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
name: build
on:
push:
branches: [master]
pull_request:
branches: [master]

jobs:
test:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
python-version: ['3.9', '3.10', '3.11']
os: [ubuntu-latest]

steps:
- name: Checkout
uses: actions/checkout@v2

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v2
with:
python-version: ${{ matrix.python-version }}

- name: Set up Redis
uses: nnhy/redis-github-action@v1.0

- name: Install dependencies
run: |
pip install -r requirements.txt
pip install coveralls
- name: Run tests
run: coverage run -m unittest discover -s tests -t tests

- name: Upload coverage data to coveralls.io
run: coveralls --service=github
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
COVERALLS_FLAG_NAME: ${{ matrix.os }} - ${{ matrix.python-version }}
COVERALLS_PARALLEL: true

lint:
name: Run Linters
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2

- name: Super-Linter
uses: github/super-linter@v4.2.2
env:
VALIDATE_PYTHON_BLACK: true
DEFAULT_BRANCH: master
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

coveralls:
name: Indicate completion to coveralls.io
needs: test
runs-on: ubuntu-latest
container: python:3-slim
steps:
- name: Finished
run: |
pip3 install --upgrade coveralls
coveralls --finish
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

release:
name: Release
runs-on: ubuntu-latest
needs: [ test, coveralls ]
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0

- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: '18'

- name: Setup
run: npm install -g semantic-release @semantic-release/github @semantic-release/changelog @semantic-release/commit-analyzer @semantic-release/git @semantic-release/release-notes-generator semantic-release-pypi

- name: Set up python
uses: actions/setup-python@v2
with:
python-version: '3.10'

- name: Install setuptools
run: python -m pip install --upgrade setuptools wheel twine

- name: Release
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
run: npx semantic-release
27 changes: 27 additions & 0 deletions .releaserc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
{
"branches": "master",
"plugins": [
"@semantic-release/commit-analyzer",
"@semantic-release/release-notes-generator",
"semantic-release-pypi",
"@semantic-release/github",
[
"@semantic-release/changelog",
{
"changelogFile": "CHANGELOG.md",
"changelogTitle": "# Semantic Versioning Changelog"
}
],
[
"@semantic-release/git",
{
"message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}",
"assets": [
"CHANGELOG.md",
"setup.py",
"setup.cfg"
]
}
]
]
}
102 changes: 101 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,101 @@
# async-redis-adapter
Async Redis Adapter for PyCasbin
====

[![GitHub Actions](https://github.com/pycasbin/async-redis-adapter/workflows/build/badge.svg?branch=master)](https://github.com/pycasbin/async-redis-adapter/actions)
[![Coverage Status](https://coveralls.io/repos/github/pycasbin/async-redis-adapter/badge.svg?branch=master)](https://coveralls.io/github/pycasbin/async-redis-adapter?branch=master)
[![Version](https://img.shields.io/pypi/v/casbin_async_redis_adapter.svg)](https://pypi.org/project/casbin_async_redis_adapter/)
[![PyPI - Wheel](https://img.shields.io/pypi/wheel/casbin_async_redis_adapter.svg)](https://pypi.org/project/casbin_async_redis_adapter/)
[![Pyversions](https://img.shields.io/pypi/pyversions/casbin_async_redis_adapter.svg)](https://pypi.org/project/casbin_async_redis_adapter/)
[![Download](https://img.shields.io/pypi/dm/casbin_async_redis_adapter.svg)](https://pypi.org/project/casbin_async_redis_adapter/)
[![License](https://img.shields.io/pypi/l/casbin_async_redis_adapter.svg)](https://pypi.org/project/casbin_async_redis_adapter/)

Async Redis Adapter is the async [redis](https://redis.io/) adapter for [PyCasbin](https://github.com/casbin/pycasbin).
With this
library, Casbin can load policy from redis or save policy to it.

## Installation

```
pip install casbin_async_redis_adapter
```

## Simple Example

```python
import asyncio
from casbin_async_redis_adapter import Adapter
import casbin


async def get_enforcer():
adapter = Adapter("localhost", 6379, encoding="utf-8")
e = casbin.AsyncEnforcer("rbac_model.conf", adapter)
model = e.get_model()

model.clear_policy()
model.add_policy("p", "p", ["alice", "data1", "read"])
await adapter.save_policy(model)

model.clear_policy()
model.add_policy("p", "p", ["bob", "data2", "write"])
await adapter.save_policy(model)

model.clear_policy()
model.add_policy("p", "p", ["data2_admin", "data2", "read"])
await adapter.save_policy(model)

model.clear_policy()
model.add_policy("p", "p", ["data2_admin", "data2", "write"])
await adapter.save_policy(model)

model.clear_policy()
model.add_policy("g", "g", ["alice", "data2_admin"])
await adapter.save_policy(model)

e = casbin.AsyncEnforcer("rbac_model.conf", adapter)
await e.load_policy()

return e


sub = "alice" # the user that wants to access a resource.
obj = "data1" # the resource that is going to be accessed.
act = "read" # the operation that the user performs on the resource.


async def main():
e = await get_enforcer()
if e.enforce("alice", "data1", "read"):
print("alice can read data1")
else:
print("alice can not read data1")


asyncio.run(main())
```

## Configuration

`Adapter()` enable decode_responses by default and supports any Redis parameter configuration.

To use casbin_redis_adapter, you must provide the following parameter configuration

- `host`: address of the redis service
- `port`: redis service port

The following parameters are provided by default

- `db`: redis database, default is `0`
- `username`: redis username, default is `None`
- `password`: redis password, default is `None`
- `key`: casbin rule to store key, default is `casbin_rules`

For more parameters, please follow [redis-py](https://redis.readthedocs.io/en/stable/connections.html#redis.Redis)

### Getting Help

- [PyCasbin](https://github.com/casbin/pycasbin)

### License

This project is licensed under the [Apache 2.0 license](LICENSE).
Empty file.
Loading

0 comments on commit 7454236

Please sign in to comment.